agentgui 1.0.1116 → 1.0.1117

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 (135) hide show
  1. package/lib/ws-handlers-util.js +63 -0
  2. package/package.json +1 -1
  3. package/site/app/js/app.js +118 -1
  4. package/site/app/js/backend.js +19 -0
  5. package/.gm/browser-config.json +0 -1
  6. package/.gm/claim-audit-fired +0 -1
  7. package/.gm/disciplines/agentgui/mem-1779277005143-0-1352.json +0 -1
  8. package/.gm/disciplines/agentgui/memories/.flat-export-done +0 -0
  9. package/.gm/disciplines/agentgui/memories/mem-c07fa3b0836edbe2-1352.md +0 -8
  10. package/.gm/gm.db +0 -0
  11. package/.gm/memories/.flat-export-done +0 -1
  12. package/.gm/memories/mem-0131ff4869d86085-370.md +0 -10
  13. package/.gm/memories/mem-04049d11cb8c1661-2135.md +0 -8
  14. package/.gm/memories/mem-069ff10372ed1770-1375.md +0 -8
  15. package/.gm/memories/mem-08a4a9e050a4deff-3048.md +0 -8
  16. package/.gm/memories/mem-09597ee0df9c9224-965.md +0 -8
  17. package/.gm/memories/mem-0993d156f571b619-1059.md +0 -8
  18. package/.gm/memories/mem-0b681bf2340c8df1-3170.md +0 -8
  19. package/.gm/memories/mem-0c444abde86202f6-1681.md +0 -8
  20. package/.gm/memories/mem-0d1408fa048b9923-1159.md +0 -8
  21. package/.gm/memories/mem-0dad5d82fec829ba-887.md +0 -8
  22. package/.gm/memories/mem-10a776effb7ce3a6-935.md +0 -8
  23. package/.gm/memories/mem-10d264b4f8e66fb4-1492.md +0 -8
  24. package/.gm/memories/mem-118c35ac67541d98-2909.md +0 -8
  25. package/.gm/memories/mem-119cf70dd19aa0a5-2225.md +0 -8
  26. package/.gm/memories/mem-15a07cd761b337c4-4320.md +0 -8
  27. package/.gm/memories/mem-15c73aca528535cb-2183.md +0 -8
  28. package/.gm/memories/mem-166f52796185e0e7-1487.md +0 -8
  29. package/.gm/memories/mem-1a148cf9c3126df5-3963.md +0 -8
  30. package/.gm/memories/mem-1a459001058f618e-567.md +0 -8
  31. package/.gm/memories/mem-1af3e13f7618e668-2146.md +0 -8
  32. package/.gm/memories/mem-1fd31d6873e9c164-794.md +0 -8
  33. package/.gm/memories/mem-21f551be092fd77d-2340.md +0 -8
  34. package/.gm/memories/mem-231ff5de003f20f0-586.md +0 -8
  35. package/.gm/memories/mem-2567393d3adb03ab-347.md +0 -8
  36. package/.gm/memories/mem-27faf41cdd050c80-1261.md +0 -8
  37. package/.gm/memories/mem-28889e43e8ce64cc-3663.md +0 -8
  38. package/.gm/memories/mem-2f4fd06515abf439-2562.md +0 -8
  39. package/.gm/memories/mem-34a749430303c5f7-544.md +0 -8
  40. package/.gm/memories/mem-3602d11d7bce9446-1057.md +0 -8
  41. package/.gm/memories/mem-38b7e24dbcba2f3e-639.md +0 -8
  42. package/.gm/memories/mem-39a7cc2f887a90b1-1079.md +0 -8
  43. package/.gm/memories/mem-40d6169c8759061d-806.md +0 -8
  44. package/.gm/memories/mem-4420e6d00e5c8632-2318.md +0 -8
  45. package/.gm/memories/mem-447e5a54ddc9357a-654.md +0 -8
  46. package/.gm/memories/mem-455b3beb4afabe14-591.md +0 -8
  47. package/.gm/memories/mem-4845ee594759151c-560.md +0 -8
  48. package/.gm/memories/mem-4a1254c60b868b88-374.md +0 -8
  49. package/.gm/memories/mem-4bafafa47a0e4b6c-3237.md +0 -8
  50. package/.gm/memories/mem-4c06c45b4d31bc60-1202.md +0 -8
  51. package/.gm/memories/mem-4dfac801d0378448-3676.md +0 -8
  52. package/.gm/memories/mem-4ecd3b713e384170-122.md +0 -10
  53. package/.gm/memories/mem-51d8992a3c6f6c9c-1073.md +0 -8
  54. package/.gm/memories/mem-539eee7e8c6c10ee-2557.md +0 -8
  55. package/.gm/memories/mem-559b8b2abc4b1091-1665.md +0 -8
  56. package/.gm/memories/mem-59dd73a463e54948-871.md +0 -8
  57. package/.gm/memories/mem-5b99b882ffe1a3c2-2262.md +0 -8
  58. package/.gm/memories/mem-5feb252a5244149c-1791.md +0 -8
  59. package/.gm/memories/mem-6224f8d185797f2b-1047.md +0 -8
  60. package/.gm/memories/mem-6434ee8261a6a6a2-3126.md +0 -8
  61. package/.gm/memories/mem-66b0947b946f3437-1155.md +0 -8
  62. package/.gm/memories/mem-6bdf783a1f6be7c2-1062.md +0 -8
  63. package/.gm/memories/mem-6d49f08bebac54c9-744.md +0 -8
  64. package/.gm/memories/mem-70d96acb736af2d7-685.md +0 -8
  65. package/.gm/memories/mem-70de7d5e71fcd439-2680.md +0 -8
  66. package/.gm/memories/mem-713614f12d7029da-1577.md +0 -8
  67. package/.gm/memories/mem-720d76c88e64f6ee-1967.md +0 -8
  68. package/.gm/memories/mem-7535f34f430fc196-1340.md +0 -8
  69. package/.gm/memories/mem-861a588d2773681a-1311.md +0 -8
  70. package/.gm/memories/mem-8af7980a92e09959-891.md +0 -8
  71. package/.gm/memories/mem-8b438ef4c609b7af-401.md +0 -8
  72. package/.gm/memories/mem-8f59884039787ef3-743.md +0 -8
  73. package/.gm/memories/mem-92b199c2024ee1aa-2513.md +0 -8
  74. package/.gm/memories/mem-9329105b05b9c0f6-324.md +0 -10
  75. package/.gm/memories/mem-94f30cec3c283f97-782.md +0 -10
  76. package/.gm/memories/mem-956d4813319f65a3-1710.md +0 -8
  77. package/.gm/memories/mem-96fffbb6615e031b-1263.md +0 -8
  78. package/.gm/memories/mem-993ab31f7a10aefa-718.md +0 -8
  79. package/.gm/memories/mem-a3e440db285f655a-995.md +0 -8
  80. package/.gm/memories/mem-a52933cd6495e6f5-2624.md +0 -8
  81. package/.gm/memories/mem-a86426ac44138c96-1606.md +0 -8
  82. package/.gm/memories/mem-a95b1d49d71133ce-1007.md +0 -8
  83. package/.gm/memories/mem-a9968a186368b022-1150.md +0 -8
  84. package/.gm/memories/mem-aaeae38d8eb01809-1076.md +0 -8
  85. package/.gm/memories/mem-ade01d9c02677c55-1557.md +0 -8
  86. package/.gm/memories/mem-b06b8c85b81663e6-1250.md +0 -8
  87. package/.gm/memories/mem-b451e5e17e555202-1490.md +0 -8
  88. package/.gm/memories/mem-b64ad00dcb6f909e-937.md +0 -8
  89. package/.gm/memories/mem-b7d6018ceca55b6f-2220.md +0 -8
  90. package/.gm/memories/mem-bdf466854032cac9-1509.md +0 -8
  91. package/.gm/memories/mem-c0482039e6ab4c50-2047.md +0 -8
  92. package/.gm/memories/mem-c4aaec5c4e6f80c2-920.md +0 -8
  93. package/.gm/memories/mem-c66976ddacb4fbe8-1454.md +0 -8
  94. package/.gm/memories/mem-c7c5bc263850c332-1844.md +0 -8
  95. package/.gm/memories/mem-cda639547932c796-713.md +0 -8
  96. package/.gm/memories/mem-cdf04ff6a6a0aa6f-671.md +0 -8
  97. package/.gm/memories/mem-cf8472c84d9e04c4-1883.md +0 -8
  98. package/.gm/memories/mem-cfd4d894370c63c3-1288.md +0 -8
  99. package/.gm/memories/mem-d060480435f92eec-1146.md +0 -8
  100. package/.gm/memories/mem-d347c921b79e6d44-1099.md +0 -8
  101. package/.gm/memories/mem-d3c8ea6c861bfbb8-1457.md +0 -8
  102. package/.gm/memories/mem-d5e928c552cd87f9-214.md +0 -10
  103. package/.gm/memories/mem-d63bc3b8a0269844-406.md +0 -10
  104. package/.gm/memories/mem-d9c19257abc2fa5e-1061.md +0 -8
  105. package/.gm/memories/mem-d9f26358a7cd3bb8-866.md +0 -8
  106. package/.gm/memories/mem-da1c91acf63d81d3-863.md +0 -8
  107. package/.gm/memories/mem-dc1ac3b04d22317e-664.md +0 -8
  108. package/.gm/memories/mem-dceeae20bc56d407-711.md +0 -8
  109. package/.gm/memories/mem-dd98b21c0896dc04-1557.md +0 -8
  110. package/.gm/memories/mem-df74674eec7745ac-178.md +0 -10
  111. package/.gm/memories/mem-dfe3b466fd5d1199-802.md +0 -8
  112. package/.gm/memories/mem-e0f9286aed2d5a06-1116.md +0 -8
  113. package/.gm/memories/mem-e1950b064099b7be-1895.md +0 -8
  114. package/.gm/memories/mem-e1d5431ae2542872-961.md +0 -8
  115. package/.gm/memories/mem-e490a181de6469fc-487.md +0 -8
  116. package/.gm/memories/mem-e72c6efbb27326fb-392.md +0 -8
  117. package/.gm/memories/mem-e943b58115a02b4c-593.md +0 -8
  118. package/.gm/memories/mem-e9bc5f9ed6edbcf7-1580.md +0 -8
  119. package/.gm/memories/mem-eae1e383927854fb-2649.md +0 -8
  120. package/.gm/memories/mem-ebbe6c0694c526f0-1392.md +0 -8
  121. package/.gm/memories/mem-ebf85becc23410b0-1633.md +0 -8
  122. package/.gm/memories/mem-ee0596fa17c7102e-362.md +0 -10
  123. package/.gm/memories/mem-ee4450fbc311b583-1361.md +0 -8
  124. package/.gm/memories/mem-ee8858162518f144-1252.md +0 -8
  125. package/.gm/memories/mem-f3297e82df622649-1166.md +0 -8
  126. package/.gm/memories/mem-f3f317c083d979ee-1210.md +0 -8
  127. package/.gm/memories/mem-f714a86465fba158-2041.md +0 -8
  128. package/.gm/memories/mem-f786bc1626d92845-204.md +0 -10
  129. package/.gm/memories/mem-f9f0dc8895b21e18-1217.md +0 -8
  130. package/.gm/memories/mem-fb3b2a7395800041-525.md +0 -8
  131. package/.gm/memories/mem-fc5753f92ee7d654-966.md +0 -8
  132. package/.gm/memories/mem-fe3faa1652f07239-480.md +0 -8
  133. package/.gm/memories/mem-ff8669e527e5c427-2788.md +0 -8
  134. package/.gm/mutables.yml +0 -53
  135. package/.gm/prd.yml +0 -3342
@@ -463,4 +463,67 @@ export function register(router, deps) {
463
463
  }
464
464
  return { subAgents: SUB_AGENT_MAP[p.id] || [] };
465
465
  });
466
+
467
+ // --- models.availability: composes agentgui's REAL model surface into the
468
+ // ModelsConfig component's shape (design SDK's ModelsConfig.js). agentgui
469
+ // has no freddie-style probed-availability matrix (no /v1/models round-trip
470
+ // per mode) - what it actually has is: discovered agent CLIs (registry,
471
+ // same data agents.list already exposes), each agent's model choices
472
+ // (agents.models' getModelsForAgent), and per-provider API-key presence
473
+ // (auth.configs' getProviderConfigs). This handler is a read-only
474
+ // composition of those three real sources, not a new probe and not fake
475
+ // data - "usable_in_any_mode" is derived from registry.isAvailable(agentId)
476
+ // (the CLI binary was actually found on this server), and "key_present"
477
+ // comes straight from getProviderConfigs' filesystem check.
478
+ router.handle('models.availability', async () => {
479
+ const agents = registry.list();
480
+ const providerConfigs = typeof getProviderConfigs === 'function' ? getProviderConfigs() : {};
481
+ const providers = [];
482
+ for (const a of agents) {
483
+ const available = registry.isAvailable(a.id);
484
+ let models = [];
485
+ if (a.id === 'claude-code') {
486
+ models = [
487
+ { id: 'sonnet', name: 'Claude Sonnet (latest)' },
488
+ { id: 'opus', name: 'Claude Opus (latest)' },
489
+ { id: 'haiku', name: 'Claude Haiku (latest)' },
490
+ ];
491
+ } else if (typeof getModelsForAgent === 'function') {
492
+ try {
493
+ const raw = await getModelsForAgent(a.id);
494
+ const list = Array.isArray(raw) ? raw : (raw?.models || []);
495
+ models = list.map((m) => ({ id: m.id, name: m.name || m.label || m.id }));
496
+ } catch { models = []; }
497
+ }
498
+ // Map onto agentgui's one real signal per model: is the agent CLI itself
499
+ // available on this server (registry.isAvailable). agentgui does not
500
+ // probe individual (model, mode) cells the way freddie's matrix does,
501
+ // so every model under an available agent reports the same single
502
+ // 'cli' mode rather than fabricating per-mode probe results.
503
+ providers.push({
504
+ id: a.id,
505
+ key_present: !!(providerConfigs[a.id] && providerConfigs[a.id].hasKey) || available,
506
+ discovery_error: available ? null : ((a.name || a.id) + ' CLI not found on this server'),
507
+ models: models.map((m) => ({
508
+ id: m.id,
509
+ name: m.name,
510
+ discovered_via: a.protocol || 'cli',
511
+ modes: { cli: { ok: !!available, skipped: !available, reason: available ? undefined : 'agent_not_installed' } },
512
+ usable_in_any_mode: !!available,
513
+ })),
514
+ });
515
+ }
516
+ const totalModels = providers.reduce((n, p) => n + p.models.length, 0);
517
+ const usableModels = providers.reduce((n, p) => n + p.models.filter((m) => m.usable_in_any_mode).length, 0);
518
+ return {
519
+ timestamp: new Date().toISOString(),
520
+ providers,
521
+ sampler: [],
522
+ summary: {
523
+ total_providers: providers.length,
524
+ total_models: totalModels,
525
+ usable_in_any_mode: usableModels,
526
+ },
527
+ };
528
+ });
466
529
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentgui",
3
- "version": "1.0.1116",
3
+ "version": "1.0.1117",
4
4
  "description": "Multi-agent ACP client with real-time communication",
5
5
  "type": "module",
6
6
  "main": "electron/main.js",
@@ -3,7 +3,7 @@ import * as B from './backend.js';
3
3
 
4
4
  installStyles().catch(() => {});
5
5
 
6
- const { AppShell, WorkspaceShell, WorkspaceRail, Topbar, Crumb, Side, Status, Chat, ChatComposer, AgentChat, ConversationList, SessionDashboard, Row, Panel, PageHeader, TextField, Select, Btn, Icon, IconButton, EventList, Spinner, Alert, FileGrid, FileSkeleton, sortFiles, FileToolbar, RootsPicker, BreadcrumbPath, EmptyState, FileViewer, FilePreviewPane, FilePreviewCode, FilePreviewText, FilePreviewMedia, ThemeToggle, ContextPane, PromptDialog, ConfirmDialog, DropZone, UploadProgress, FilterPills, SessionMeta, BulkBar, Checkbox, ShortcutList, FocusTrap, AgentListSkeleton, flashComposerNote, toast, withBusy, GitStatusPanel, GitDiffView, WorktreeSwitcher, Badge } = C;
6
+ const { AppShell, WorkspaceShell, WorkspaceRail, Topbar, Crumb, Side, Status, Chat, ChatComposer, AgentChat, ConversationList, SessionDashboard, Row, Panel, PageHeader, TextField, Select, Btn, Icon, IconButton, EventList, Spinner, Alert, FileGrid, FileSkeleton, sortFiles, FileToolbar, RootsPicker, BreadcrumbPath, EmptyState, FileViewer, FilePreviewPane, FilePreviewCode, FilePreviewText, FilePreviewMedia, ThemeToggle, ContextPane, PromptDialog, ConfirmDialog, DropZone, UploadProgress, FilterPills, SessionMeta, BulkBar, Checkbox, ShortcutList, FocusTrap, AgentListSkeleton, flashComposerNote, toast, withBusy, GitStatusPanel, GitDiffView, WorktreeSwitcher, Badge, ModelsConfig, PluginsConfig } = C;
7
7
 
8
8
  // One duration/bytes vocabulary across every surface: prefer the kit's shared
9
9
  // formatters (exported alongside the components), fall back to the local
@@ -52,6 +52,13 @@ const state = {
52
52
  // One-time welcome banner naming what each tab is for. Shown until
53
53
  // dismissed once, ever - a returning user has already learned the tabs.
54
54
  showOnboarding: lsGet('agentgui.onboarded') !== '1',
55
+ // Models tab: composed agent/provider availability (models.availability WS
56
+ // handler), fed into the design SDK's ModelsConfig component.
57
+ models: { data: null, loading: false, error: null, selectedProviderId: null },
58
+ // Plugins tab: agentgui has no freddie-style plugin host - the closest real
59
+ // extensibility surface is the discovered agent-CLI registry (agents.list),
60
+ // adapted to PluginsConfig's {name,surfaces,requires,enabled,status} shape.
61
+ plugins: { selected: null },
55
62
  };
56
63
 
57
64
  // Two-step arm controls auto-reset after this delay so an accidental first click
@@ -331,6 +338,24 @@ function navTo(tab, { writeHash: doWriteHash = true, push = true } = {}) {
331
338
  // filesMain (which runs during render) - a render-time fetch is fragile under
332
339
  // a double-render and re-enters render() while building the tree.
333
340
  if (tab === 'files' && !state.files.path && !state.files.loading && !state.files.error) loadDir('');
341
+ // Chat's @-mention autocomplete (mentionFiles) reuses state.files.entries -
342
+ // seed it from the root listing on first chat visit so mentions work
343
+ // without requiring a prior Files-tab visit. Uses the same confined
344
+ // B.listDir the Files tab itself calls; failure is silent (mentionFiles
345
+ // just stays empty, same as never having visited Files).
346
+ if (tab === 'chat' && !state.files.entries.length && !state.files.loading && !state.files.error) {
347
+ B.listDir(state.backend, '').then((j) => {
348
+ if (!state.files.entries.length) state.files.entries = j.entries || [];
349
+ if (!state.files.roots.length) state.files.roots = j.roots || [];
350
+ render();
351
+ }).catch(() => {});
352
+ }
353
+ // Models tab: composed agent/provider availability, fetched on first visit
354
+ // (and via the ModelsConfig 'refresh' action thereafter).
355
+ if (tab === 'models' && !state.models.data && !state.models.loading && !state.models.error) loadModelsAvailability();
356
+ // Plugins tab reuses state.agents (agents.list) - same lazy load as chat's
357
+ // agent picker, so visiting Plugins directly (deep-link/reload) still works.
358
+ if (tab === 'plugins' && !state.agents.length && !state.agentsLoading && !state.agentsError) loadAgents();
334
359
  // popstate calls navTo with writeHash:false so it never replaceState-clobbers
335
360
  // the entry it popped; user-initiated navigation pushes so Back walks tabs.
336
361
  if (doWriteHash) writeHash({ push });
@@ -675,6 +700,10 @@ function view() {
675
700
  } else if (state.tab === 'settings') {
676
701
  // Same word as the rail item - location chrome must not fork vocabulary.
677
702
  crumbLeaf = 'settings';
703
+ } else if (state.tab === 'models') {
704
+ crumbLeaf = 'models';
705
+ } else if (state.tab === 'plugins') {
706
+ crumbLeaf = 'plugins';
678
707
  }
679
708
  const crumb = Crumb({ trail: crumbTrail, leaf: crumbLeaf, right: [dot] });
680
709
 
@@ -773,6 +802,8 @@ function workspaceRail() {
773
802
  { key: 'files', label: 'Files', icon: 'folder', active: state.tab === 'files', onClick: () => navTo('files') },
774
803
  { key: 'live', label: 'Live', icon: 'activity', active: state.tab === 'live', count: liveCount || null, rail: liveHasError ? 'flame' : undefined, onClick: () => navTo('live') },
775
804
  { key: 'git', label: 'Git', icon: 'branch', active: state.tab === 'git', onClick: () => navTo('git') },
805
+ { key: 'models', label: 'Models', icon: 'circle-dot', active: state.tab === 'models', onClick: () => navTo('models') },
806
+ { key: 'plugins', label: 'Plugins', icon: 'link', active: state.tab === 'plugins', onClick: () => navTo('plugins') },
776
807
  { key: 'settings', label: 'Settings', icon: 'settings', active: state.tab === 'settings', onClick: () => navTo('settings') },
777
808
  ];
778
809
  return WorkspaceRail({
@@ -977,6 +1008,8 @@ function mainContent() {
977
1008
  if (state.tab === 'files') return filesMain();
978
1009
  if (state.tab === 'live') return liveMain();
979
1010
  if (state.tab === 'git') return gitMain();
1011
+ if (state.tab === 'models') return modelsMain();
1012
+ if (state.tab === 'plugins') return pluginsMain();
980
1013
  return settingsMain();
981
1014
  }
982
1015
 
@@ -1080,6 +1113,61 @@ function gitMain() {
1080
1113
  ];
1081
1114
  }
1082
1115
 
1116
+ // Models tab: agentgui's real model surface composed by the models.availability
1117
+ // WS handler (agent-CLI registry availability + provider key presence), fed
1118
+ // into the design SDK's ModelsConfig component. Not freddie's probed per-mode
1119
+ // matrix - see lib/ws-handlers-util.js models.availability for the mapping.
1120
+ function modelsMain() {
1121
+ const m = state.models;
1122
+ return [
1123
+ PageHeader({ compact: true, dense: true, title: 'Models', lede: 'Discovered agent CLIs, their models, and provider key presence on this server.' }),
1124
+ ModelsConfig({
1125
+ data: m.data,
1126
+ loading: m.loading,
1127
+ error: m.error,
1128
+ selectedProviderId: m.selectedProviderId,
1129
+ onSelectProvider: (id) => { state.models.selectedProviderId = id; render(); },
1130
+ onRefresh: () => loadModelsAvailability(),
1131
+ }),
1132
+ ];
1133
+ }
1134
+
1135
+ // Plugins tab: agentgui has no freddie-style plugin host (~150 discoverable
1136
+ // plugin.js files) - its actual extensibility surface is the discovered
1137
+ // agent-CLI registry (lib/agent-discovery.js + lib/claude-runner-agents.js
1138
+ // AgentRegistry, the same data agents.list already exposes to the chat
1139
+ // picker). Adapted onto PluginsConfig's shape: name=agent id, surfaces=
1140
+ // protocol (cli|acp), requires=[] (agents have no dependency graph), enabled=
1141
+ // available (the CLI was actually found on this server), status=install hint
1142
+ // when missing. There is no enable/disable action (agentgui does not gate
1143
+ // which agent CLIs are usable) so onToggle re-checks availability instead of
1144
+ // pretending to flip a setting that doesn't exist.
1145
+ function pluginsMain() {
1146
+ const list = (state.agents || []).map((a) => ({
1147
+ name: a.id,
1148
+ version: undefined,
1149
+ surfaces: a.protocol || 'cli',
1150
+ requires: [],
1151
+ source: a.npxPackage ? ('npx ' + a.npxPackage) : undefined,
1152
+ enabled: a.available !== false,
1153
+ status: a.available !== false ? 'loaded' : (a.npxInstallable ? 'installable via npx' : 'not found'),
1154
+ }));
1155
+ return [
1156
+ PageHeader({ compact: true, dense: true, title: 'Plugins', lede: 'Discovered agent CLIs — agentgui\'s real extensibility surface (no freddie-style plugin host).' }),
1157
+ PluginsConfig({
1158
+ plugins: list,
1159
+ selected: state.plugins.selected,
1160
+ loading: !!state.agentsLoading,
1161
+ error: state.agentsError,
1162
+ onSelect: (name) => { state.plugins.selected = name; render(); },
1163
+ // No real enable/disable exists - re-run discovery so a just-installed
1164
+ // CLI's availability reflects immediately instead of a fake toggle.
1165
+ onToggle: () => { withBusy(null, () => loadAgents(), 'checking…'); },
1166
+ onReload: () => loadAgents(),
1167
+ }),
1168
+ ];
1169
+ }
1170
+
1083
1171
  // --- files (folder browser) ---
1084
1172
  async function loadDir(dirPath, { fromHash = false } = {}) {
1085
1173
  state.files = state.files || {};
@@ -2508,6 +2596,16 @@ function chatMain() {
2508
2596
  messages: state.chat.messages,
2509
2597
  busy: state.chat.busy,
2510
2598
  draft: state.chat.draft,
2599
+ // Scroll-position overview strip alongside the thread.
2600
+ showMinimap: true,
2601
+ // @-mention file autocomplete: reuse the Files tab's own data source
2602
+ // (state.files.entries, populated by loadDir/listDir) rather than a new
2603
+ // fetch. Scoped to whatever directory Files last listed - if the user
2604
+ // hasn't opened Files yet this is empty and the composer simply shows
2605
+ // no mention suggestions until they do (no fake/synthetic file list).
2606
+ mentionFiles: (state.files.entries || [])
2607
+ .filter((e) => e && e.path)
2608
+ .map((e) => ({ path: e.path, isDir: e.type === 'dir' })),
2511
2609
  // Idle never reads 'resuming…' (nothing is in flight - the continuation
2512
2610
  // fact lives in the composer context line and banner); a remotely-stopped
2513
2611
  // turn reads 'stopped', not a normal finish.
@@ -4351,6 +4449,25 @@ async function loadAgents() {
4351
4449
  }
4352
4450
  }
4353
4451
 
4452
+ // Models tab data load: models.availability WS handler composes agent
4453
+ // registry + provider key presence into ModelsConfig's expected shape. See
4454
+ // lib/ws-handlers-util.js for exactly what each field means in agentgui (no
4455
+ // freddie-style per-mode probe matrix - one real 'cli' mode per model).
4456
+ async function loadModelsAvailability() {
4457
+ state.models.loading = true;
4458
+ state.models.error = null;
4459
+ render();
4460
+ try {
4461
+ state.models.data = await B.getModelsAvailability(state.backend);
4462
+ state.models.loading = false;
4463
+ render();
4464
+ } catch (e) {
4465
+ state.models.loading = false;
4466
+ state.models.error = errText(e) || 'failed to load model availability';
4467
+ render();
4468
+ }
4469
+ }
4470
+
4354
4471
  // Boot-time automatic retries with backoff when the first agents fetch fails
4355
4472
  // (the server may still be warming up).
4356
4473
  async function retryLoadAgents() {
@@ -435,6 +435,25 @@ export async function listAgentModels(base, agentId) {
435
435
  } catch { return []; }
436
436
  }
437
437
 
438
+ // Composed model-availability view for the Models tab (ModelsConfig
439
+ // component): per-agent CLI availability + models, in the shape ModelsConfig
440
+ // expects ({timestamp, providers, sampler, summary}). See lib/ws-handlers-
441
+ // util.js models.availability for what each field really means in agentgui
442
+ // (no probed per-mode matrix like freddie - one real 'cli' mode per model).
443
+ export async function getModelsAvailability(base) {
444
+ return wsCall(base, 'models.availability', {});
445
+ }
446
+
447
+ // Provider API-key configs (masked) for the Models tab's provider auth info -
448
+ // backs the existing Settings 'keys' surface, reused here as-is.
449
+ export async function getAuthConfigs(base) {
450
+ return wsCall(base, 'auth.configs', {});
451
+ }
452
+
453
+ export async function saveAuthConfig(base, providerId, apiKey, defaultModel) {
454
+ return wsCall(base, 'auth.save', { providerId, apiKey, defaultModel });
455
+ }
456
+
438
457
  // ---------- Git / worktrees (WS) ----------
439
458
 
440
459
  export async function gitStatus(base, { cwd } = {}) {
@@ -1 +0,0 @@
1
- {"headless": true, "chrome_ready_deadline_ms": 60000}
@@ -1 +0,0 @@
1
- clean
@@ -1 +0,0 @@
1
- aicat kit polished + Select primitive (2026-05-20): anentrypoint-design v0.0.127 published. Changes: ChatComposer auto-grows up to 200px on input via taRef + autoGrow handlers; Chat + AICat threads auto-scroll to bottom via threadRef when user is within 240px of bottom (preserves manual scroll-back); ChatMessage avatar fallback uses first letter of `name` instead of bare '?'; EventList accepts both `items:`/`events:` aliases and `code:`/`rank:` aliases for backward-compat; new Select({label,value,options,onChange,placeholder,hint}) primitive exported from src/components/content.js + components.js barrel; mobile responsive breakpoint at 768px collapses chat-stack to 100% and shrinks avatars; empty chat.css placeholder removes build warning. agentgui site/app/js/app.js rewired: pin to 0.0.127, replaced raw <select> model picker with Select({}), replaced raw <a> stop/new + raw <button> save+reconnect with Btn({}), assistant turns now render kind:'md' with typing indicator on in-progress empty message. Browser-witnessed: selectCount=1, rawSelectInApp=0, rawButtonInApp=0, btnPrimary 'save + reconnect' rendered in settings. Zellous pins @latest so auto-picks new version; loads clean. Publish flow: push to main triggers .github/workflows/publish.yml which patch-bumps + npm-publishes + tags. My commit set 0.0.126 → CI bumped to 0.0.127.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-c07fa3b0836edbe2-1352
3
- ns: agentgui
4
- created: 1783453880853
5
- updated: 1783453880853
6
- ---
7
-
8
- aicat kit polished + Select primitive (2026-05-20): anentrypoint-design v0.0.127 published. Changes: ChatComposer auto-grows up to 200px on input via taRef + autoGrow handlers; Chat + AICat threads auto-scroll to bottom via threadRef when user is within 240px of bottom (preserves manual scroll-back); ChatMessage avatar fallback uses first letter of `name` instead of bare '?'; EventList accepts both `items:`/`events:` aliases and `code:`/`rank:` aliases for backward-compat; new Select({label,value,options,onChange,placeholder,hint}) primitive exported from src/components/content.js + components.js barrel; mobile responsive breakpoint at 768px collapses chat-stack to 100% and shrinks avatars; empty chat.css placeholder removes build warning. agentgui site/app/js/app.js rewired: pin to 0.0.127, replaced raw <select> model picker with Select({}), replaced raw <a> stop/new + raw <button> save+reconnect with Btn({}), assistant turns now render kind:'md' with typing indicator on in-progress empty message. Browser-witnessed: selectCount=1, rawSelectInApp=0, rawButtonInApp=0, btnPrimary 'save + reconnect' rendered in settings. Zellous pins @latest so auto-picks new version; loads clean. Publish flow: push to main triggers .github/workflows/publish.yml which patch-bumps + npm-publishes + tags. My commit set 0.0.126 → CI bumped to 0.0.127.
package/.gm/gm.db DELETED
Binary file
@@ -1 +0,0 @@
1
- {"digest":"14650fb0739d0383:n=0","total":0}
@@ -1,10 +0,0 @@
1
- ---
2
- key: mem-0131ff4869d86085-370
3
- ns: default
4
- created: 1781775262609
5
- updated: 1781775262609
6
- ---
7
-
8
- ## Resolved mutable: index-style-full-extent
9
-
10
- /config/workspace/agentgui/site/app/index.html:26-265 is the full inline <style> block (--agentgui-* vars, .pill/.cwd-bar/.resume-banner/.history-empty/.health-chip/.settings-grid/.boot-splash/.chat-controls/.ds-event-list overrides+event-flash keyframe/responsive+print). app.js grep style: = 7 inline margin-utility props.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-04049d11cb8c1661-2135
3
- ns: default
4
- created: 1781943736813
5
- updated: 1781943736813
6
- ---
7
-
8
- agentgui screen-real-estate layer (2026-06-12, fluid columns + drag-resize). Workflow .claude/workflows/gui-screen-realestate.js (6 density lenses space-efficiency/viewport-utilization/information-density/adaptive-layout/application-chrome/finish-pending). 50 agents -> 17 confirmed (PUNCHLIST-DENSITY.md). Kit pushed anentrypoint-design 97dc646. Verdict: maximize screen real-estate, SDK must read as a desktop app. Shell reclaims viewport: fixed --ws-rail-w 232/--ws-sessions-w 296/--ws-pane-w 320 (~848px chrome) became fluid clamps clamp(200px,16vw,260px) etc. Kit shell.js renders keyboard+pointer .ws-resizer separators (role=separator, ArrowLeft/Right 16px, pointer-drag) between each track writing clamped inline --ws-<col>-w persisted localStorage ds.ws.w.<col>, seeded on mount via ref seedWsWidths (no app wiring). Sessions desktop collapse toggle (.ws-sessions-toggle in crumb; .ws-desktop-toggle CSS = inverse of mobile drawer-toggle; toggleWs extended 'sessions'->ws-sessions-collapsed). .btn* moved off --r-pill to --r-1 (8/14 pad, 32 min-h, 44 coarse). .app-status thin 26px ellipsized strip (--app-status-h 26px). .chat-msg-flat centers at --measure (margin-inline auto) + density-scaled via --density token + 84ch ultrawide tier. .ds-dash-grid densified minmax 240/220 wide. CONCURRENT-WRITER RULE (load-bearing): while this run was in flight, concurrent writers shipped the ENTIRE Files multi-select+density-thumbnail+move on BOTH design/main and agentgui/main, so this run's parallel multi-select/move/F3 work was DROPPED and theirs adopted; only re-vendored kit dist + workflow + docs landed. Rule: when origin advances mid-run with the same feature, drop yours and adopt theirs, then re-apply only genuinely-distinct work onto their files; the agentgui /api/move-confined endpoint built this run was redundant with their /api/move and discarded. Kit ships 4 build lints (tokens/glyphs/null-children/classes) - all must pass. Witness localhost:3009/gm/ caveat: vendored bundle served fresh only after SERVER restart (pre-warms statics in memory) AND fresh browser context (persistent witness caches the ES module).
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-069ff10372ed1770-1375
3
- ns: default
4
- created: 1780601438566
5
- updated: 1780601438566
6
- ---
7
-
8
- agentgui GUI-audit (2026-06-04) CLOSED. workflow wvf3xfw7x ran 64-agent fan-out -> 44 confirmed findings (AUDIT-PUNCHLIST.md, 38 deduped). All fixed+pushed across 3 surfaces. agentgui origin/main commits: cf710c6 (SSE unwrap, resume hygiene, security headers), eb1eab3 (vendored kit batch + CSP fonts + non-resume warn), 951404e (AGENTS.md doc). Kit anentrypoint-design origin/main bb776aa (streaming-md perf, Row aria-expanded, responsive @media + cwd clamp, CodeNode full-code key, 44x44 tap targets, head sub-line from status, glyph cleanup) -> publish.yml publishes npm->unpkg. KEY LEARNINGS: (1) ccsniff /v1/history/stream 'event' frame is {sid, payload:flattenedEvent} - app MUST unwrap data.payload (store.js:130); reading the wrapper gave undefined counters. (2) CSP hardening MUST allow fonts.googleapis.com (style-src) + fonts.gstatic.com (font-src) or the kit drops to system fonts. (3) DS Select (content.js:312) already promotes title->aria-label so title= gives a real accessible name (unlike SearchInput which needs label=). (4) index.html loads kit from LOCAL ./vendor/ now (not unpkg), so vendored 247420.{js,css} IS what the live GUI serves - witness against it directly. (5) kit publish: commit normal msg + push origin/main; publish.yml syncs version w/ npm + publishes (skips on [skip publish]/chore(release): msgs). PRD 339/339 resolved, phase COMPLETE.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-08a4a9e050a4deff-3048
3
- ns: default
4
- created: 1781796096862
5
- updated: 1781796096862
6
- ---
7
-
8
- agentgui 16th run (2026-06-18): design-maturity sweep + dead-code + secret-hardening, tracked by ONE Workflow-tool run gui-design-16 (wf_6479308b-24f, 12 lenses chat-thread/composer-input/files-browser/sessions-dashboard/shell-chrome/tokens-theme/a11y-motion/history-settings/marketing-site/glyph-residue/dead-code/server-security): 54 agents -> hunt -> adversarial verify -> 40 confirmed, ~2.7M tokens. Applied via a clean per-file subagent fan-out (one agent per physical file = zero edit conflicts). KIT fixes (/config/workspace/design): chat.js ToolCallNode gates args section on hasArgs (no more 'args {}' on result-only cards) + textarea binds disabled; agent-chat.js cwd aria-busy; content.js EventList forwards detail/actions/highlight/meta to Row (expanded history events were dropping toolInput detail+copy+highlight) + TextField full invalid/error state (.ds-field-error role=alert); interaction-primitives.js ShortcutList splits combos into discrete .ds-kbd caps (.ds-kbd-caps/.ds-kbd-sep + new app-shell.css rules); sessions.js rail filter migrated bespoke .ds-session-search -> shared SearchInput/.ds-search-input (one filter control); shell.js WsResizer aria-valuetext; voice.js x-glyph->Icon('x'), community.js ellipsis-glyph->'more'. chat.css cwd is-checking+aria-busy+r-1 radius, breakdown idle->--stale double-inset (was colliding amber w/ connecting disc), breakdown running shape-ring, ds-dash-clear hover/focus, chat-tool-copy focus-visible, errors-toggle AA. app-shell.css composer+ws reduced-motion guards, .ds-file-row.is-locked/.is-restricted+.ds-file-perm-tag chip, ws-drawer-toggle 44px, density-btn/filter-pill AA (color:var(--fg)). editor-primitives.css #000 dock shadow->var(--shadow-3) + #fff checkbox fallback dropped. app-surfaces.css @media print re-asserts paper signal tokens. community.css :focus-visible for ThreadPanel/Forum/Page+forum-search. marketing.css NEW .site-footer family (theme.mjs footers off the .app-status strip that suppressed content <=1100px)+site-cli baseline/card/tokens+100dvh embed. SERVER lib/http-handler.js: SECRET_RE now also on /api/upload-file+/api/mkdir+/api/rename (403 secret/dotfile target, was overwrite-secret hole) + /api/list filters secret dirents + /api/download RFC-5987 Content-Disposition (CJK/emoji name no longer throws ERR_INVALID_CHAR). DEAD-CODE: agentgui site/app/vendor/cdn/ (36 files, markdown stack fetches jsDelivr at runtime), scripts/harvest-fixtures.mjs, the 3 copy-vendor.js lines in .github/workflows/build-platforms.yml (script deleted 15th run, CI was broken); kit scripts/bundle-markdown.mjs. WITNESSED localhost:3009/gm/?token via gm browser verb: dark rgb(19,19,24), 3 resizers, hScroll 0, ds-search-input=1/ds-session-search=0, perm-tag/site-footer/kbd-caps rules resolve, 0 console errors. validate-mutations 26/26 PASS, test.js 10/0, kit 4 lints pass. RECURRING PATTERN: server start needs setsid bash -c 'exec bun server.js' with NO pkill afterward (pkill kills the fresh one); ss has no perms here, use curl /health (401 under PASSWORD = up).
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-09597ee0df9c9224-965
3
- ns: default
4
- created: 1781197658408
5
- updated: 1781197658408
6
- ---
7
-
8
- agentgui env/witness caveats (2026-06-11, linux container): server runs PORT=3009 (3000 owned by another app); plugkit spool out/ keeps STALE responses from prior sessions - a Read racing the watcher write returns old bytes, re-read if content does not match the probe; plugkit browser sessions expire between dispatches (fresh session needs full goto with waitUntil commit); first git_status after heavy churn can report stat-cache false positives (an empty git_diff refreshes the index). Theme tokens: --flame/--amber/--code-* are LIGHT values at :root (#C53E00/#8A6512, AA on paper) with dark brights restored in BOTH dark blocks + the paper-island block; tool errors are routine in agent sessions (1-2% of events) so error UI derives from DENSITY (sessionErrorDense: errors>=3 AND >15%) or recency, never has-any-error. Destructive ACTION = warn red; flame = error STATUS only. /api/move shipped (dual realpath confinement); validate-mutations.mjs is 26 checks.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-0993d156f571b619-1059
3
- ns: default
4
- created: 1782996727275
5
- updated: 1782996727275
6
- ---
7
-
8
- agentgui 3rd run (2026-06-05): GUI-predictability sweep closure. Fan-out reviewers (chat/history/settings/shell + perf/security/glyph/override) -> adversarial verify -> 19 PRD rows fixed+pushed. Headline theme: override-elimination - index.html's !important overrides converted to kit defaults (Topbar active-tab tinted+underline, PageHeader compact prop, Row cursor:pointer for role=button, kit Chat dropped decorative head dot). Also: kit ToolCallNode (no output) placeholder, kit safeUrl() rejects javascript:/data:/file: in inline renderer (bypasses DOMPurify), streaming chat text uses .chat-md container to avoid settle reflow. App fixes: distinct backend-status keys, per-sid running-dot key, stale-selectedSid clear, per-session live counter, toolLabel scalar fallback. gui-audit.js workflow gained overrides surface + KEPT-SET glyph guard (middot/ellipsis/em-dash are kept product typography, never flagged). Kit dist git add -f / rebase-rebuild caveat noted. index.html loads kit from LOCAL vendored copy (superseded/reconfirmed by many later runs).
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-0b681bf2340c8df1-3170
3
- ns: default
4
- created: 1781105971140
5
- updated: 1781105971140
6
- ---
7
-
8
- agentgui GUI completion sweep (2026-06-10, 8th max-effort run) CLOSED. NEW workflow .claude/workflows/gui-completion.js (6 coverage lenses hunting what 7 prior sweeps scoped out: file-management-crud, routing-deeplinks, conversation-control, history-settings-depth, onboarding-recovery, crosscut-new-surface; 75 agents -> 46 confirmed gaps, PUNCHLIST-COMPLETION.md). PUSHED: agentgui 422361f, kit anentrypoint-design e603785. READ-ONLY FILES SCOPE CUT REVERSED: server lib/http-handler.js fsAllowRoots()+sanitizeEntryName() (rejects separators/traversal/ADS colon/reserved Windows names/trailing dot-space)+readBody(cap,413)+isAllowRoot(roots never mutation targets); POST /api/rename {path,newName}, POST /api/delete {path,recursive} (non-empty dir no-recursive -> 409), POST /api/mkdir, PUT /api/upload-file?dir&name&overwrite=1 (raw bytes 50MB no multipart dep), GET /api/stat (confined cwd validation); CSRF guard on POST/PUT/DELETE (reject cross-site Sec-Fetch-Site + simple-form CT + no auth header); /health gains projectsDir+allowRoots; scripts/validate-mutations.mjs = 17 live security checks (traversal/out-of-roots/root-refusal/reserved/ADS/CSRF/409s/round-trip) ALL PASS - rerun after touching the mutation surface. FULL HASH ROUTING: HASH_KEYS=[tab,sid,dir,file,q,project,section], buildHash reads all view state, writeHash({push}) user-nav pushes, popstate diffs full set via navTo(tab,{writeHash:false}) (no clobber), chat+sid names tab=chat explicitly, files dir/file deep-link in+out+Back WITNESSED live. CONVERSATION: editAndResend two-step confirm + CLEARS resumeSid on truncation (never --resume diverged tail; retry last-turn keeps it); draft persisted; followups derived from settled turn; exportActions copy-all/md/json; ContextPane session{turns,cost}. RESILIENCE: backend.js streamChat 12s grace on ws closed (reconnect re-subscribes, turn continues); health re-probe on ws drop + 10s poll while not-ok + reconnected announce; loadAgents backoff + agentsError banner + installHint (npx commands) when zero available; errText plain-copy map; cwd validated via /api/stat; warmup copy after 5s. HISTORY/SETTINGS: tool_use purple rail fixed (was always green); FilterPills event filter pre-slice; jump-to-first-error; Row actions copy-event; per-session JSON export; SessionMeta header; search highlight mark.ds-hl + windowed title; settings server/keyboard panels; ONE SHORTCUTS array feeds ?-overlay+settings; live/files prefs persisted (live selection Set deliberately NOT - stale sids); two-step stop-all confirms. KIT: FileRow{actions,busy}+perm-disabled, Row{highlight,actions}+Panel/PageHeader{id}+FilterPills, SessionMeta (.ds-session-meta-strip - .ds-session-meta was taken), dashboard onArmStop*, ConversationList loadingText, agent-chat installHint/exportActions/confirmEdit, context-pane session block. GOTCHAS: spool browser verb takes RAW playwright code (page.*), NOT {url,evaluate} JSON, 14s exec cap - split multi-nav witnesses; curl/bash JSON escaping on Windows mangles backslash paths - use a node fetch script for endpoint validation; kit remote advances with chore(release) commits - stash/rebase/rebuild before committing kit.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-0c444abde86202f6-1681
3
- ns: default
4
- created: 1783677428217
5
- updated: 1783677428217
6
- ---
7
-
8
- agentgui 31st run addendum (2026-07-10): confirming gm-continue pass caught that the gui-ux-craft workflow's light-theme-contrast lens had crashed mid-run (API connection error) and never actually produced findings - a real coverage gap, not a clean pass. Dedicated follow-up audit computed real WCAG contrast ratios (not eyeballed) and found 6 genuine light-theme failures the crashed lens would have caught: chat avatar initials using raw --mascot/--accent-ink on tinted backgrounds (2.03:1/3.65:1), tool-done status text using --success/--green-2 (3.18:1/2.88:1) instead of the text-safe --green, --amber measuring 4.26:1 on --bg-2 (narrowly failing AA on the background it actually renders on, despite being tuned for --paper), --danger measuring 4.25:1 on --bg-2 for the same reason (auth-error banner), raw --mascot as button/CLI text (3.11:1), and --sun being essentially unusable everywhere it's used (1.1-1.5:1 against every app background) - retired in favor of --amber. All fixed with the same pattern as the 22nd-run --accent->--accent-ink precedent: separate text-safe 'deep' tokens from fill/border tokens, and always check contrast against the ACTUAL background a token renders on (--bg-2 card surfaces, not just --paper) not just the token's own design-time tuning target. LESSON for gm-continue: when a workflow notification includes a `failures` array naming a lens that errored out, that lens's scope is unaudited work, not a null result - it belongs in the confirming PLAN pass as its own row, the same as any other unaudited surface. Kit pushed df04d69, agentgui pushed 03002cf, CI green (Test/Deploy GH Pages/Publish and Release/Auto-Declaudeify all success).
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-0d1408fa048b9923-1159
3
- ns: default
4
- created: 1782996219086
5
- updated: 1782996219086
6
- ---
7
-
8
- agentgui 11th run (2026-06-11): Files command surface + PASSWORD-boot fix. CRITICAL: PASSWORD-gated deploys couldn't boot the SPA - /gm/?token= served index.html but static subresources carried no token -> 401 -> blank page forever. Fixed via HttpOnly SameSite=Lax agentgui_token cookie set on any successful auth; WS keeps ?token=. Files became a command surface: kit FileGrid multi-select (marked Set, tri-state header checkbox, EACCES rows unmarkable, Ctrl/Cmd+A) + density modes (list/compact/thumb) + BulkBar export; app wired bulk-delete via ConfirmDialog + Promise.allSettled (failures stay selected). thumbUrl must use downloadUrl (fsAllowRoots) not imageUrl (narrower allowlist, 403s repo files). Shipped-jank fixes: .ds-file-open dead CSS from an earlier run, filesMain dropped permissions field, Crumb narrow-collapse keyed on wrong container class, webjsx null-attribute-toggle bug, elevation unification (panel=bg-2+hairline+r-2, no shadow). Env: validate-mutations.mjs made portable; plugkit chromium needs --no-sandbox; page.goto waits on hung CDN subresources use waitUntil:commit; witness body is shell-interpolated so avoid $(...)/backticks.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-0dad5d82fec829ba-887
3
- ns: default
4
- created: 1784892479919
5
- updated: 1784892479919
6
- ---
7
-
8
- agentgui docstudio-port run (2026-07-24): added MenuButton (checkmarked select menu, overlay-primitives.js), ChatSuggestions (blank-thread composer-priming chips, chat.js), BatchProgressLabel/formatBatchOutcome (sequential batch progress + aggregate outcome toast, editor-primitives.js), InfoRow/InfoSection/DiagnosticsPanel (static debug readouts, editor-primitives.js) to the anentrypoint-design kit, all barrel-exported. Real webjsx crash found+fixed mid-verify: InfoSection's loading-to-loaded transition mixed key namespaces at the same diff slot -- reusing one key across a text-only render and an element-children render crashes applyDiff('reading key'); fixed by giving the two branches distinct keys (body-loading/body-rows). Standing lesson: a component switching between structurally-different children at the same slot needs each branch keyed distinctly, not just the parent.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-10a776effb7ce3a6-935
3
- ns: default
4
- created: 1780044606446
5
- updated: 1780044606446
6
- ---
7
-
8
- agentgui composer (DS ChatComposer in c:/dev/anentrypoint-design/src/components/chat.js): the message textarea is controlled (value prop). Re-applying value on every parent render resets the caret and drops fast keystrokes. FIX (in the kit, then rebuild+vendor): send() reads the LIVE textarea value via a captured taEl ref (not the lagging value prop); taRef syncs el.value to the prop ONLY when they differ. Paired app.js change: composer onInput re-renders only on empty<->non-empty draft transition (the only change that toggles the send button disabled state), not per keystroke. Verified live: GUI chat round-trip GUIOK/REBUILT streamed end-to-end (compose->WS chat.sendMessage->claude-code->streaming_progress->transcript). Playwright .type() still only lands 1 char (synthetic per-char typing races the controlled re-render) but native-setter/paste/IME and human typing work — that is a test-harness artifact, not a user bug.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-10d264b4f8e66fb4-1492
3
- ns: default
4
- created: 1781174463909
5
- updated: 1781174463909
6
- ---
7
-
8
- agentgui GUI Claude-Code-web parity sweep (2026-06-11, 10th run) CLOSED. workflow .claude/workflows/gui-claude-code-parity.js (6 design-language lenses vs claude.ai/code; 66 agents -> 37 gaps, PUNCHLIST-PARITY.md). PUSHED kit anentrypoint-design 28387c3 + agentgui 0a93fc6. KIT: AgentChat flat:true+aicat:false -> .chat-msg-flat full-width avatar-less turns + .chat-role label + faint assistant bg (bubble layout kept only for messenger demo); composer one bordered rounded-rect shell (textarea borderless, inline --r-1 send, was --r-pill+50% circle); .chat-tool bordered status-toned card (bundle had ZERO before); .chat-code-lang lang tab; ::selection accent-tint not mascot; WorkspaceShell mainFlush + .ws-main gutter + .ws-crumb min-height:48; SessionDashboard status-bucket groups + header breakdown + .ds-dash-stream-disc heartbeat + tri-state select-all + is-armed pulse; SessionCard cost/isNew/icon-actions/is-stale amber bar; TYPE_ICON.dir=folder + file-image/link icons; ConversationList skeleton; FilePreviewCode Prism highlight + gutter; motion easing reduced-motion-guarded. LOAD-BEARING webjsx FIX: filter(Boolean) EVERY children array (SessionCard passed raw nulls positionally; applyDiff crashes reading key on ANY null among VElements, pre-existing latent bug). GOTCHA port 3000 owned by another app -> witness on PORT=3009; first /gm/ hit = 30-90s ccsniff walk. DEFERRED (rows pending): Files multi-select+density, /api/move-confined, up-button+grid-shortcuts, F3 elevation.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-118c35ac67541d98-2909
3
- ns: default
4
- created: 1783690602154
5
- updated: 1783690602154
6
- ---
7
-
8
- agentgui 34th run (2026-07-10): user re-requested max gui usability/practicality/predictable/negative-space via wfgy-method critique (identical ask to 31st/32nd/33rd runs). Ran gui-ux-craft workflow wf_919164f1-648 (34 agents, all completed, 0 errors) plus a parallel live-browser negative-space audit agent. Negative-space audit came back CLEAN (no new dead-void/contrast/overlap regressions across chat/history/settings/files at 1280/900/420px) - three consecutive clean passes (31st/33rd/34th) on that specific dimension, recommend future sweeps shift focus to interaction-level polish instead. Main workflow confirmed findings across typography-rhythm/copy-tone/perceived-perf/kit-dx/interaction-density lenses. Kit fixes (design repo): editor-primitives.css shadow font tokens --fs-2/--fs-0 didn't exist anywhere in the real scale, remapped to --fs-lg/--fs-tiny (4 spots); stale --lh-base fallback 1.4 fixed to 1.55 (matches live token, 4 spots); app-shell.css .glyph/.ds-field-count/.ds-row-detail hardcoded literals tokenized; ~29 hardcoded outline:2px solid var(--accent-ink) focus rules across chat.css/editor-primitives.css converted to var(--focus-w) solid var(--focus-color) with negative-offset calc() handling for inset rows; .chat-tool-copy added to the coarse-pointer touch-affordance media block (was the one tool-action button missing 44px floor); .ds-select gained a base min-height:32px floor (previously only per-scope overrides had it); Btn's className prop renamed to class to match Panel/Heading convention (2 call sites in sessions.js updated); AgentControls/AgentChat gained an agentsLoading prop mirroring the existing modelsLoading disabled-select pattern; COMPONENT_API.md gained Btn variant-precedence and PageHeader compact/dense/id docs. App fixes (agentgui): History no longer falls back to the raw session id when a session has no title/project - falls back to cwd then 'Untitled conversation'; ACP provider-error copy truncated+prefixed 'connection failed, try restart:'; Settings/Live copy-tone fixes ('chat'->'conversation', 'cwd'->'folder' in placeholders); ConversationList loading skeleton no longer gated to the history tab; new-chat confirm dialog copy aligned ('Clear conversation?'->'Start a new chat?'). Kit build 0 errors, re-vendored dist/247420.{js,css} (css 454635->456041 bytes, js 392679->393309 bytes) into site/app/vendor/anentrypoint-design/. Browser-witnessed live (0 pageErrors, .ds-select min-height computed 32px in the live DOM confirming the vendored bundle carries the fix). Kit pushed to origin/main after a rebase (a release commit had landed concurrently, ee518e8/f808233 -> 3b1080c). agentgui pushed 9c8094b, all 4 CI checks (Deploy GH Pages, Publish and Release, Auto-Declaudeify, Test) green. Standing gotcha reused again: PASSWORD env value '123,slam,123,slam' must be treated as one literal token (contains commas) for ?token= browser auth.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-119cf70dd19aa0a5-2225
3
- ns: default
4
- created: 1781109622887
5
- updated: 1781109622887
6
- ---
7
-
8
- agentgui GUI logic+predictability sweep (2026-06-10, 9th max-effort run) CLOSED. NEW workflow .claude/workflows/gui-logic-predictability.js (6 lenses: interaction-lifecycle, cross-surface-consistency, information-architecture, realtime-truth, input-ergonomics, scale-robustness; 78 agents -> 67 confirmed findings, PUNCHLIST-LOGIC.md). KIT (anentrypoint-design): ConfirmDialog/PromptDialog {error,busy,busyLabel} + DOCUMENT-LEVEL Escape listener + focus-restore only on genuine close (queueMicrotask remount guard - webjsx refs re-fire null->el on every render, naive teardown re-steals focus); SessionCard {stopping,title,elapsedMs,external} + fmtDuration export; ChatComposer {onPasteFiles,onDropFiles} + IME guard + Esc-cancels-while-busy + hint line + per-bit context onClick; AgentChat {shownMessages,onShowEarlier} MESSAGE_CAP=100 + 20k-streaming tail window + {cwdError,cwdChecking}; UploadProgress {actions,onDismiss}; hasSelectionInside + autoscroll pause; markdown loader 30s retry never latches degraded; fmtBytes=fmtFileSize 0 B. APP: realSid=claudeSessionId||sessionId dashboard join; error-from-recency not cumulative; per-sid toolRunning stale derivation; ev.i maxI SSE dedup; max(index,tally) counters; persistChat debounce+100msg cap+4KB tool-payload trim+quota banner+cross-tab storage ts-guard; Escape ladder overlay>file-dialog>confirms>stop-generation; window dragover/drop preventDefault outside dropzones; Mod+Shift+L; stopping Set + awaited bulk stops; upload drain queue + 409 replace; settings reorder; '/' on files/live. SERVER: chat.active rows carry claudeSessionId; streaming_cancelled broadcast (aborted never completes); 60s terminal-frame replay on re-subscribe (replayedTerminal) fixes ws-drop busy-hang; chat_active_changed hints; /v1/history events ?limit shim in server.js (ccsniff has none). GOTCHAS: parallel kit/app agents drift on prop contracts - this run caught app onPasteImage vs kit onPasteFiles AND backend missing streaming_cancelled type; ALWAYS grep the joints after parallel batches. Browser witness caught Escape dead with focus on H1 (kit listener was backdrop-scoped) - fixed document-level + app ladder fallback. Witnessed 0 errors all tabs, 420px no h-scroll, glyphs 0.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-15a07cd761b337c4-4320
3
- ns: default
4
- created: 1783687056884
5
- updated: 1783687056884
6
- ---
7
-
8
- {"key":"agentgui-33rd-run-ux-craft-sweep","value":"agentgui 33rd run (2026-07-10): user re-requested max gui usability/practicality/predictable/negative-space via wfgy-method critique (identical ask to 31st/32nd runs). Ran gui-ux-craft workflow wf_7f1a513c-2a3 (34 agents, 33 completed, 21 confirmed, 1 lens (kit-dx) crashed mid-run) plus a parallel live-browser negative-space audit (found 2 new issues: Settings health-chip 'connected' text used raw --accent lime rgb(182,255,27) on near-invisible near-paper bg - fixed to --accent-ink on tinted bg; History empty-state had fixed min-height:50vh centered void leaving 300px+ dead space at 1280px and >50% viewport blank at 420px - fixed to natural top-aligned height with a new .history-empty-hints ShortcutList filling the reclaimed space). Kit fixes (chat.css/app-shell.css/editor-primitives.css/community.css/colors_and_type.css/agent-chat.js/context-pane.js/sessions.js/components.js): --tr-caps/--lh-long/--space-2 token adoption for 4 hardcoded typography values, cwd-fact font-family made consistently mono across composer/context-pane/dashboard, agent-name font-family made consistently sans, panel margin-bottom rhythm aligned to files-stack gap, brightness(1.08) lightening hover bugs on send-button/rail-action/editor-dialog-buttons fixed to brightness(0.92) darkening (AA-safe pattern from 32nd run), --green-2 text contrast fix in community.css, light-theme ::selection contrast raised to 46% (dark theme's 24% explicitly preserved), --accent-tint light-theme value switched to blend --accent-ink instead of raw --accent (dark theme value explicitly pinned), CwdBar save/cancel button order fixed to match ConfirmDialog convention, 30 hardcoded focus-ring outline instances (not just the 11 originally cited - same mechanical bug repeated) routed to --focus-w/--focus-color/--focus-offset tokens, chip/badge tone-success/tone-error/tone-neutral families consolidated (all legacy class aliases preserved), icon-btn-primary hover color fixed to match btn-primary's two-tone-flip, new AgentListSkeleton component (shimmer-row loading state matching FileSkeleton pattern, had to also add it to src/components.js barrel export - a component only exists to consumers if re-exported there, sessions.js alone isn't enough), UploadProgress gained an indeterminate/marquee CSS state for in-flight transfers with no percent yet. App fixes (app.js): session-vs-conversation vocabulary unified (Live tab copy, stopAllActive messages, Alert title), duplicated folder-drop announce string hoisted to one const, 'allowed root(s)' internal-jargon replaced with 'accessible folder(s)' at 6 user-facing sites (internal fsAllowRoots fn name/comments untouched), boot render no longer gated behind the health-probe await (state.health='unknown' + synchronous render() before the probe), agents-loading branch now uses AgentListSkeleton instead of bare spinner+text, upload rows pass indeterminate:true for in-flight zero-percent state. kit-dx lens re-run separately found 3 real doc gaps (voice.js/theme-toggle.js/data-density.js entirely undocumented, SessionMeta undocumented next to documented SessionCard, 6 utility exports undocumented) all fixed in COMPONENT_API.md. Used 4-6 parallel subagents to implement disjoint file sets concurrently (kit CSS agent, app.js agent, upload-progress agent, kit-dx audit agent, then a docs agent) - worked well since file ownership was cleanly split, though one subagent's rebuild step raced another's and both had to re-run node scripts/build.mjs at the end to reconcile before final vendor copy. LESSON: a new kit component isn't actually consumable until it's re-exported through src/components.js's barrel - adding it only to the component file itself (e.g. sessions.js) leaves it invisible to the bundle even after a successful build with 0 lint errors; always grep the built dist for the new export name to confirm before wiring app.js against it. Kit pushed 4105bd1, agentgui pushed 3bac0fe then a94bf92 (PRD-state-only commit), all CI green both repos (Test/Auto-Declaudeify/Deploy GH Pages/Publish and Release on agentgui; Deploy GH Pages/Publish 247420 to npm on design), browser-witnessed live via agent-browser (0 console errors) at localhost with PASSWORD=comma-containing token treated as one literal string throughout."}
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-15c73aca528535cb-2183
3
- ns: default
4
- created: 1784299879288
5
- updated: 1784299879288
6
- ---
7
-
8
- agentgui 46th run (2026-07-17): fourth docstudio design-cue pass, same directive repeated. Fresh Explore-agent survey of /config/docstudio (told what runs 42-45 already shipped) found only 1 genuinely new candidate after exhausting low-hanging fruit: chat.js's two role=log chat-thread containers (chat.js:533,581) and agent-chat.js's one (agent-chat.js:476) gained aria-live=polite aria-relevant=additions, matching docstudio chat-tabs.js:62-65, so new messages announce to screen readers without spamming on streamed tokens - verified via source that aria-relevant=additions only fires on new keyed-sibling insertion (agent-chat.js:582's per-message keyed map), not in-place text mutation during streaming, so no live-dispatch witness was needed for that corner case. A second candidate (self-retry dropdown trigger, docstudio chat-model-selector.js) was explicitly skipped since no async-populated dropdown exists in the kit yet to wire it to - avoided speculative unused plumbing. Also fixed an unrelated hygiene bug surfaced mid-rebase: kit test.js's lint-tokens.mjs spacing-report regex only matched the old "[lint-spacing] REPORT — N raw" format; upstream v0.0.349's ratcheted-spacing-lint change reformatted stdout to "PASS — N <= baseline N", silently breaking the regression check - widened regex to match both formats. Kit rebased cleanly onto v0.0.348/v0.0.349 (one dist-only conflict, resolved by rebuilding dist/247420.js fresh). Kit pushed 8436f0a->f81f93d, all 3 kit CI checks green. agentgui re-vendored, browser-witnessed live on localhost:3009/gm/ (bodyLen:19429, hasAgentgui:true, 0 console errors, .agentchat-thread confirmed via page.evaluate to carry role=log aria-live=polite aria-relevant=additions), pushed e84cf26->639b78e->fef8222, all 4 CI checks green each push. Standing observation: the Test workflow's bun-install step sometimes takes ~13 minutes (likely npm registry propagation delay for a freshly-published kit version) before completing green - not a hang, just slow; worth waiting rather than treating as stuck if the job's own step-by-step status (via gh api repos/.../actions/jobs/<id>) shows genuine progression rather than a frozen step.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-166f52796185e0e7-1487
3
- ns: default
4
- created: 1783891644525
5
- updated: 1783891644525
6
- ---
7
-
8
- {"key":"agentgui-27th-run-negative-space-attention-detail","value":"agentgui 27th run (2026-07-03): negative-space + attention sweep, scoped to the specific ask (not a full agent fan-out) - a live-browser review (screenshots + DOM measurement at 1280px and 420px) across chat/files/settings. Chat/settings visual balance was already reasonable from the prior 26 runs; found and fixed 2 real issues. (1) Files filter placeholder 'Filter files in this directory' clipped against its intentionally-compact 220px input (no ellipsis, last character cut off at the box edge) - shortened to 'Filter files', which fits without widening the control (the kit's own comment already states the compact width is deliberate: a full-width filter 'reads as a search page and costs fold height'). (2) Settings SERVER panel rendered 4 short facts (version/uptime/connected clients/projects folder) each as its own .lede div - .lede is the fs-xl/tall-line-height INTRO-PARAGRAPH style, not a metadata style, so 4 short facts read as 4 oversized paragraphs with real dead vertical space between them, and inconsistent density vs the allowed-roots rows directly below (already using the compact SessionMeta strip). Folded all 4 facts into one SessionMeta call alongside the roots - same information, denser, one consistent style for every fact in the panel. Browser-witnessed at both viewport widths, no wrap/overlap regression. No kit changes needed (both fixes were app-only copy/wiring). Pushed b0b38fb."}
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-1a148cf9c3126df5-3963
3
- ns: default
4
- created: 1784278257475
5
- updated: 1784278257475
6
- ---
7
-
8
- {"key":"agentgui-42nd-run-gui-practicality-sweep","value":"agentgui 42nd run (2026-07-17): user-driven cwd-practicality complaint plus a mid-run docstudio design-cue directive. cwd practicality: added an inline browse popover (reuses existing confined /api/list into an independent state.cwdBrowse), always-visible allowed-roots chips (prefetched on editor open), a small localStorage recent-cwd MRU (capped 6), relative-subpath resolution against the current cwd, and fixed a real bug where Escape did nothing to close the cwd editor (global keydown typing-guard blurred+returned before the Escape ladder - added a targeted exception + nested browse-then-editor ladder). History's directory fact gained a one-click 'use as chat cwd' action (kit SessionMeta gained generic onAction/actionLabel). REAL INFRASTRUCTURE BUG found+fixed: the cwd browse popover inherited a previously-undiscovered production bug where this env's nginx proxy_pass URI normalization silently collapses an encoded %2F path-segment slash back to a literal / before forwarding, 403ing any /api/list/<abs-path>-shaped request - this ALSO meant the pre-existing Files tab drill-down navigation had been broken in production the whole time. Fixed by switching /api/list,/api/stat,/api/file,/api/download,/api/image to ?dir=/?path= query params (immune to that normalization) via a new resolveConfinedPath() helper; validate-mutations.mjs confirmed byte-identical confinement semantics. gui-completion workflow (wf_bcf46a89-739, 29 agents, 17 confirmed): rename/mkdir 409 suggested-alternate-name prefill; bulk-move roots picker (kit PromptDialog gained roots/onPickRoot); DELETE IS NOW SOFT - moves into a confined per-root .agentgui-trash/ (10min retention, purge-on-delete + 200-entry eviction cap) with a real undo toast via new POST /api/restore, not just confirm-before; search-hit event anchors now carried in the URL hash (ets=); Settings gained a scroll-position scrollspy; truncation banners state actual turn count+cost; cross-tab reload banner warns about+confirms discarding an unsent draft; History gained persistent next/prev error nav; session header shows agent/model (sess.model, not the nonexistent sess.agent - caught a wrong-field bug mid-implementation); backend.js's onSessionExpired() was exported but NEVER subscribed - a mid-session 401 failed every fetch completely silently, now shows a persistent reload banner; offline banner gained a manual retry-now button; search-term highlighting now extends into expanded event bodies; History search results gained a JSON export button; Settings gained navigator.storage.estimate(). REAL KIT CRASH found+fixed mid-implementation: passing a VElement/extra prop through ConversationList's caption prop (which is separately used as aria-label:caption||'Conversations', requiring a plain string) caused an intermittent webjsx 'reading key' crash - confirmed via 3 before/after browser runs, re-implemented as a fully separate sibling element outside ConversationList entirely, re-verified crash-free across 3 more runs. Standing lesson: when extending what a caller passes through an existing kit prop, grep every OTHER use site of that prop inside the component first - a prop's contract can be narrower than it looks from the one call site you're touching. docstudio design-cue pass: a subagent found docstudio (vanilla-ESM Material/Gemini-styled) architecturally LESS mature than the kit in every systemic dimension; only 1 of 6 candidate cues was a real gap (session-group eyebrow labels used the generic --tr-caps token instead of the canonical --tr-label token .t-label/.t-micro already establish) - fixed. Two upstream-diverged kit rebases handled cleanly (one single-conflict, one 35-commits-diverged) by rebuilding dist/ fresh from merged sources, never hand-merging generated code. Kit pushed 7c27e9c->fb11176->acd5fd2, agentgui pushed 71d7352->56b865f->2fecd75->a1a394a->5496ec8, all CI green throughout both repos."}
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-1a459001058f618e-567
3
- ns: default
4
- created: 1784892511617
5
- updated: 1784892511617
6
- ---
7
-
8
- agentgui docstudio-port run (2026-07-24): added MenuButton, ChatSuggestions, BatchProgressLabel/formatBatchOutcome, InfoRow/InfoSection/DiagnosticsPanel to the anentrypoint-design kit, all barrel-exported. Real webjsx crash found+fixed mid-verify: InfoSection loading-to-loaded transition mixed key namespaces at the same diff slot, crashing applyDiff reading key; fixed by giving the two branches distinct keys body-loading/body-rows. Standing lesson: a component switching between structurally-different children at the same slot needs each branch keyed distinctly.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-1af3e13f7618e668-2146
3
- ns: default
4
- created: 1781952326763
5
- updated: 1781952326763
6
- ---
7
-
8
- agentgui 20th run iter5 (2026-06-20): ROOT FIX of the cli-wrapper id-mismatch bug class (pushed 80d4b7c). lib/agent-discovery.js discoverAgents() used to REPLACE each found ACP agent (opencode, protocol acp, has path) with a CLI_WRAPPERS entry (id cli-opencode, protocol cli-wrapper, acpId opencode). This cli-* id scheme existed ONLY in discoveredAgents - the registry (claude-runner-agents.js), the WS client picker, and acp-sdk-manager ACP_TOOLS all use plain ids (opencode/gemini/kilo/codex). So every code path that cross-referenced discoveredAgents by the client/registry id broke: (1) getModelsForAgent returned [] for all ACP agents [iter3 4454082]; (2) external-ACP sub-agent discovery dead [iter4 c7de4f5]; (3) agent-descriptors.js:22 'agent.id===opencode' never matched cli-opencode -> opencode/gemini got the generic description + lost the model input spec; (4) process-message.js carried a dead wrapper-resolution branch. The cli-wrapper getModelsForAgent branch did EXACTLY what the plain acp branch does, so the wrapper was pure indirection+bugs. FIX: removed CLI_WRAPPERS const + the wrapper loop/filter in discoverAgents (return plain found agents), the cli-wrapper branch in server-utils getModelsForAgent, the dead wrapper-resolution + now-unused discoveredAgents param in process-message.js; retargeted the iter3 regression test to a protocol:'acp' discoveredAgent. BINARIES already had opencode/gemini/kilo/codex protocol:'acp'+npxPackage so removal is behavior-preserving (improving for descriptors). No client/persisted cli-* ids ever existed (picker always used registry ids). WITNESSED: startup 'Agent IDs: claude-code, opencode, gemini, kilo, codex'; agents.models probe -> [ACP-SDK] kilo started; getAgentDescriptor('opencode') real description + hasModelSpec:true; tests 47/47. NOTE: agent-descriptors module is production-dead (getAgentDescriptor/getAllDescriptors only called by test.js) - candidate for removal IF descriptor-serving is confirmed unwanted (ambiguous intent - ACP capability advertisement). discoveredAgents itself is now near-redundant with registry; full dual-registry consolidation still possible.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-1fd31d6873e9c164-794
3
- ns: default
4
- created: 1780041284686
5
- updated: 1780041284686
6
- ---
7
-
8
- agentgui agent availability: WS agents.list uses registry.isAvailable(id) (lib/ws-handlers-util.js:29) which runs where/which on the command. On hosts where an agent binary is installed outside the system PATH (e.g. claude.exe in ~/.local/bin not on Windows PATH), where fails and the picker shows "(not installed)". Fix pattern: give the registry entry an npxPackage so isAvailable falls back to checking bun/npx presence (returns available-via-npx) instead of false. claude-code now has npxPackage @anthropic-ai/claude-code in lib/claude-runner-agents.js, matching the discovery fallback. The GUI agent picker (site/app/js/app.js) sorts the 4 flagship orchestration targets first: PRIMARY_AGENTS=[claude-code,opencode,kilo,agy], then other-available, then npx-installable, then not-installed.
@@ -1,8 +0,0 @@
1
- ---
2
- key: mem-21f551be092fd77d-2340
3
- ns: default
4
- created: 1781870430413
5
- updated: 1781870430413
6
- ---
7
-
8
- agentgui 19th run (2026-06-19): maximum-effort quality sweep. Workflow wf_8183560b-e3d (132 agents, 12 lenses, 93 confirmed). APPLIED: resume-transcript-load (loadResumeTranscript() on resumeSid, historical:true messages, loading spinner); acp-force-restart (restart Btn on unhealthy ACP agents, wsCall acp.restart -> ws-handlers-util.js -> acp-sdk-manager.restart()); chat thinking settled state; retry on non-last message; streaming-active badge on chat rail tab; AT: followup-chips aria-live guard, cwd focus restore, shortcuts overlay role=dialog; composer disabled visual state (.is-disabled opacity .55); files-modals focus trap re-query on every Tab, stable modal aria-labelledby (random suffix not seq); sessions.js ConversationList role=listbox + aria-selected; a11y-07 fixed. History: tool_use/tool_result rail=purple; load-older announce(); session cost in meta strip. perf: sortedAgents memoized in state._sortedAgentsCache, files filter 150ms debounced, _seen Set capped 5000->trim 2500, chatFollowups memoized _followupsCache, sessionGroups memoized _sessionGroupsCache, upload DOM <input> cleanup, pathBasename util (4 dedup sites), humanizeMs->fmtDuration. Dead code: historySide() removed (~100 lines), getAvailableAgents export removed. Constants: ARM_RESET_MS=4000. refreshHistory _historyFetching guard. backend.js: SSRF guard localhost+127.0.0.1 allowed, ws-drop message 'Connection lost - please reconnect', stream 500 error sanitized (<300 chars non-JSON), auth-token 401 onSessionExpired hook. http-handler.js: IPv4-mapped IPv6 normalization for rate-limit, image route streaming+20MB cap (was sync readFileSync), IS_WINDOWS module-level. Security: files-plugin confineToRoots(browse+mkdir), acp-plugin shell-injection fix, plugin-routes CSRF fix (server-startup2.js), workflow-plugin unconfined file read fix, asset-server JS injection fix (PASSWD-JS-INJECTION). Code: getAvailableAgents export removed from claude-runner-run.js. Kit rebuilt (design): thinking settled text, retry non-last-msg, aria-modal on all dialogs (already there), combobox role on CommandPalette (already there), tab ArrowLeft/Right (already there), files-modals focus trap, sessions listbox, chat disabled .is-disabled. validate-mutations and test.js not re-run (rate-limited). Pushed agentgui 9de566e; kit vendor re-built from design HEAD.