create-walle 0.9.13 → 0.9.14

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 (58) hide show
  1. package/README.md +6 -1
  2. package/bin/create-walle.js +195 -30
  3. package/bin/mcp-inject.js +18 -53
  4. package/package.json +3 -1
  5. package/template/claude-task-manager/approval-agent.js +7 -0
  6. package/template/claude-task-manager/docs/session-standup-command-center-design.md +242 -0
  7. package/template/claude-task-manager/git-utils.js +111 -3
  8. package/template/claude-task-manager/lib/session-history.js +144 -16
  9. package/template/claude-task-manager/lib/session-standup.js +409 -0
  10. package/template/claude-task-manager/lib/standup-attention.js +200 -0
  11. package/template/claude-task-manager/lib/status-hooks.js +8 -2
  12. package/template/claude-task-manager/lib/update-telemetry.js +114 -0
  13. package/template/claude-task-manager/lib/walle-default-model.js +55 -0
  14. package/template/claude-task-manager/lib/walle-mcp-auto-config.js +62 -0
  15. package/template/claude-task-manager/lib/walle-supervisor.js +83 -19
  16. package/template/claude-task-manager/lib/worktree-cwd.js +82 -0
  17. package/template/claude-task-manager/providers/codex-mcp.js +104 -0
  18. package/template/claude-task-manager/providers/index.js +2 -0
  19. package/template/claude-task-manager/public/css/setup.css +2 -1
  20. package/template/claude-task-manager/public/css/walle.css +5 -0
  21. package/template/claude-task-manager/public/index.html +1596 -283
  22. package/template/claude-task-manager/public/js/session-search-utils.js +171 -1
  23. package/template/claude-task-manager/public/js/setup.js +62 -19
  24. package/template/claude-task-manager/public/js/stream-view.js +55 -6
  25. package/template/claude-task-manager/public/js/walle-session.js +73 -16
  26. package/template/claude-task-manager/public/js/walle.js +34 -2
  27. package/template/claude-task-manager/server.js +780 -177
  28. package/template/claude-task-manager/session-integrity.js +58 -15
  29. package/template/claude-task-manager/workers/approval-widget-validator.js +15 -5
  30. package/template/claude-task-manager/workers/state-detectors/codex.js +6 -0
  31. package/template/package.json +1 -1
  32. package/template/wall-e/agent.js +36 -7
  33. package/template/wall-e/api-walle.js +72 -20
  34. package/template/wall-e/coding/stream-processor.js +22 -2
  35. package/template/wall-e/coding-orchestrator.js +26 -6
  36. package/template/wall-e/eval/agent-runner.js +16 -4
  37. package/template/wall-e/eval/benchmark-generator.js +21 -1
  38. package/template/wall-e/eval/benchmarks/coding-agent.json +0 -596
  39. package/template/wall-e/eval/codex-cli-baseline.js +633 -0
  40. package/template/wall-e/eval/eval-orchestrator.js +3 -3
  41. package/template/wall-e/eval/run-agent-benchmarks.js +11 -3
  42. package/template/wall-e/eval/run-codex-cli-baseline.js +177 -0
  43. package/template/wall-e/lib/mcp-integration.js +220 -0
  44. package/template/wall-e/llm/ollama.js +47 -8
  45. package/template/wall-e/llm/ollama.plugin.json +1 -1
  46. package/template/wall-e/llm/tool-adapter.js +1 -0
  47. package/template/wall-e/loops/ingest.js +42 -8
  48. package/template/wall-e/mcp-server.js +272 -10
  49. package/template/wall-e/memory/ctm-session-context.js +910 -0
  50. package/template/wall-e/server.js +26 -1
  51. package/template/wall-e/skills/_bundled/scan-ctm-sessions/SKILL.md +20 -0
  52. package/template/wall-e/skills/_bundled/scan-ctm-sessions/run.js +43 -0
  53. package/template/wall-e/skills/skill-planner.js +52 -3
  54. package/template/wall-e/tools/builtin-middleware.js +55 -2
  55. package/template/wall-e/tools/shell-policy.js +1 -1
  56. package/template/wall-e/tools/slack-owner.js +104 -0
  57. package/template/website/index.html +2 -2
  58. package/template/builder-journal.md +0 -17
@@ -7,9 +7,18 @@ window.WalleSession = (function() {
7
7
  'use strict';
8
8
 
9
9
  // ---------- state helper ----------
10
+ function initialModelFromSession(s) {
11
+ var meta = (s && s.meta) || {};
12
+ return {
13
+ model: meta.model_registry_id || meta.modelRegistryId || meta.model_id || '',
14
+ provider: meta.model_provider ? providerLabel(meta.model_provider) : '',
15
+ };
16
+ }
17
+
10
18
  function getState(id) {
11
19
  var s = state.sessions.get(id);
12
20
  if (!s) return null;
21
+ var initialModel = initialModelFromSession(s);
13
22
  if (!s.walleState) {
14
23
  s.walleState = {
15
24
  messages: [],
@@ -17,16 +26,26 @@ window.WalleSession = (function() {
17
26
  totalCost: 0,
18
27
  totalTokens: 0,
19
28
  messageCount: 0,
20
- selectedModel: '',
29
+ selectedModel: initialModel.model,
21
30
  selectedModelLabel: '',
22
- selectedModelProvider: '',
23
- _currentAssistant: null
31
+ selectedModelProvider: initialModel.provider,
32
+ _currentAssistant: null,
33
+ _modelHydrated: true,
34
+ _modelManual: false
24
35
  };
36
+ } else if (!s.walleState._modelHydrated) {
37
+ s.walleState.selectedModel = s.walleState.selectedModel || initialModel.model;
38
+ s.walleState.selectedModelProvider = s.walleState.selectedModelProvider || initialModel.provider;
39
+ s.walleState._modelHydrated = true;
40
+ } else if (initialModel.model && !s.walleState.selectedModel && !s.walleState._modelManual) {
41
+ s.walleState.selectedModel = initialModel.model;
42
+ s.walleState.selectedModelProvider = s.walleState.selectedModelProvider || initialModel.provider;
25
43
  }
26
44
  return s.walleState;
27
45
  }
28
46
 
29
47
  var _walleModelRegistryCache = null;
48
+ var _walleModelRegistryLoaded = false;
30
49
  var _walleModelRegistryPromise = null;
31
50
  var _walleModelPicker = null;
32
51
 
@@ -464,6 +483,7 @@ window.WalleSession = (function() {
464
483
 
465
484
  var ws = getState(id);
466
485
  if (!ws) return;
486
+ if (ws.isGenerating) return;
467
487
 
468
488
  var msg = { role: 'user', content: text, timestamp: Date.now() };
469
489
  ws.messages.push(msg);
@@ -475,9 +495,13 @@ window.WalleSession = (function() {
475
495
  scrollToBottom(messagesArea);
476
496
  }
477
497
 
478
- // Send via WebSocket (include model if user selected one)
498
+ // Send via WebSocket (include model/provider when the session is pinned)
479
499
  var model = ws.selectedModel || '';
480
- send({ type: 'walle-message', id: id, text: text, model: model, contextSessionId: resolveContextSessionId(id) });
500
+ var modelItem = findModelItem(model);
501
+ var session = state.sessions.get(id);
502
+ var meta = (session && session.meta) || {};
503
+ var provider = modelItem ? modelItem.provider : (model && model === meta.model_id ? (meta.model_provider || '') : '');
504
+ send({ type: 'walle-message', id: id, text: text, model: model, provider: provider, contextSessionId: resolveContextSessionId(id) });
481
505
 
482
506
  // Clear input
483
507
  textarea.value = '';
@@ -736,18 +760,31 @@ window.WalleSession = (function() {
736
760
  }
737
761
 
738
762
  // ---------- model picker ----------
763
+ function invalidateWalleModelCache() {
764
+ _walleModelRegistryCache = null;
765
+ _walleModelRegistryLoaded = false;
766
+ }
767
+
739
768
  function loadWalleModels() {
740
- if (_walleModelRegistryCache) return Promise.resolve(_walleModelRegistryCache);
769
+ if (_walleModelRegistryLoaded && Array.isArray(_walleModelRegistryCache)) {
770
+ return Promise.resolve(_walleModelRegistryCache);
771
+ }
741
772
  if (_walleModelRegistryPromise) return _walleModelRegistryPromise;
742
- _walleModelRegistryPromise = fetch('/api/models/registry')
743
- .then(function(r) { return r.json(); })
773
+ _walleModelRegistryPromise = fetch('/api/models/registry', { cache: 'no-store' })
774
+ .then(function(r) {
775
+ if (!r.ok) throw new Error('HTTP ' + r.status);
776
+ return r.json();
777
+ })
744
778
  .then(function(data) {
745
- _walleModelRegistryCache = normalizeWalleModels(data.models || data || []);
779
+ if (data && data.error) throw new Error(data.error);
780
+ var rows = Array.isArray(data) ? data : (Array.isArray(data?.models) ? data.models : []);
781
+ _walleModelRegistryCache = normalizeWalleModels(rows);
782
+ _walleModelRegistryLoaded = true;
746
783
  return _walleModelRegistryCache;
747
784
  })
748
785
  .catch(function() {
749
- _walleModelRegistryCache = [];
750
- return _walleModelRegistryCache;
786
+ invalidateWalleModelCache();
787
+ return [];
751
788
  })
752
789
  .finally(function() {
753
790
  _walleModelRegistryPromise = null;
@@ -898,8 +935,10 @@ window.WalleSession = (function() {
898
935
 
899
936
  function findModelItem(modelId) {
900
937
  if (!_walleModelRegistryCache || !modelId) return null;
938
+ var id = String(modelId);
901
939
  for (var i = 0; i < _walleModelRegistryCache.length; i++) {
902
- if (_walleModelRegistryCache[i].id === modelId) return _walleModelRegistryCache[i];
940
+ var item = _walleModelRegistryCache[i];
941
+ if (item.id === id || item.modelId === id) return item;
903
942
  }
904
943
  return null;
905
944
  }
@@ -910,6 +949,7 @@ window.WalleSession = (function() {
910
949
  ws.selectedModel = item ? item.id : '';
911
950
  ws.selectedModelLabel = item ? item.baseLabel : '';
912
951
  ws.selectedModelProvider = item ? item.providerLabel : '';
952
+ ws._modelManual = true;
913
953
  syncWalleModelButtons(id);
914
954
  closeModelPicker();
915
955
  }
@@ -962,7 +1002,7 @@ window.WalleSession = (function() {
962
1002
  popover.appendChild(footer);
963
1003
 
964
1004
  var showLegacy = false;
965
- var models = _walleModelRegistryCache || [];
1005
+ var models = _walleModelRegistryLoaded ? (_walleModelRegistryCache || []) : [];
966
1006
 
967
1007
  function makeSection(titleText) {
968
1008
  var title = document.createElement('div');
@@ -1026,7 +1066,7 @@ window.WalleSession = (function() {
1026
1066
 
1027
1067
  function renderList() {
1028
1068
  while (body.firstChild) body.removeChild(body.firstChild);
1029
- if (!models.length && !_walleModelRegistryCache) {
1069
+ if (!models.length && !_walleModelRegistryLoaded) {
1030
1070
  renderLoading();
1031
1071
  return;
1032
1072
  }
@@ -1090,7 +1130,7 @@ window.WalleSession = (function() {
1090
1130
  }
1091
1131
  });
1092
1132
 
1093
- if (_walleModelRegistryCache) {
1133
+ if (_walleModelRegistryLoaded) {
1094
1134
  renderList();
1095
1135
  } else {
1096
1136
  renderLoading();
@@ -1239,6 +1279,21 @@ window.WalleSession = (function() {
1239
1279
  }
1240
1280
  }
1241
1281
 
1282
+ function handleModel(msg) {
1283
+ var id = msg.id;
1284
+ var s = state.sessions.get(id);
1285
+ if (!s) return;
1286
+ s.meta = s.meta || {};
1287
+ if (msg.model_id) s.meta.model_id = msg.model_id;
1288
+ if (msg.model_provider) s.meta.model_provider = msg.model_provider;
1289
+ var ws = getState(id);
1290
+ if (!ws || ws._modelManual || !msg.model_id) return;
1291
+ ws.selectedModel = msg.model_id;
1292
+ ws.selectedModelLabel = '';
1293
+ ws.selectedModelProvider = msg.model_provider ? providerLabel(msg.model_provider) : ws.selectedModelProvider;
1294
+ syncWalleModelButtons(id);
1295
+ }
1296
+
1242
1297
  // ---------- public API ----------
1243
1298
  return {
1244
1299
  getState: getState,
@@ -1248,6 +1303,8 @@ window.WalleSession = (function() {
1248
1303
  handleResponse: handleResponse,
1249
1304
  handleHistory: handleHistory,
1250
1305
  handleError: handleError,
1251
- populateWalleModelSelector: populateWalleModelSelector
1306
+ handleModel: handleModel,
1307
+ populateWalleModelSelector: populateWalleModelSelector,
1308
+ invalidateModelCache: invalidateWalleModelCache
1252
1309
  };
1253
1310
  })();
@@ -2045,6 +2045,7 @@ function renderChatUI() {
2045
2045
  html += '</div>'; // container
2046
2046
 
2047
2047
  safeSetHtml(body, html);
2048
+ renderServiceAlerts(_serviceAlerts);
2048
2049
 
2049
2050
  // Update elapsed timer if processing
2050
2051
  if (chatThinkingState.isProcessing && chatThinkingState.startTime) {
@@ -6095,10 +6096,12 @@ checkProviderStatus();
6095
6096
  // ---------------------------------------------------------------------------
6096
6097
 
6097
6098
  var _alertsPollTimer = null;
6099
+ var _serviceAlerts = [];
6098
6100
 
6099
6101
  function checkServiceAlerts() {
6100
6102
  api('/alerts').then(function(d) {
6101
6103
  var alerts = d.alerts || [];
6104
+ _serviceAlerts = alerts;
6102
6105
  var providerIssue = null;
6103
6106
  for (var i = 0; i < alerts.length; i++) {
6104
6107
  var issue = _normalizeProviderIssue(alerts[i]);
@@ -6130,8 +6133,12 @@ function renderServiceAlerts(alerts) {
6130
6133
  var safeId = esc(a.id).replace(/'/g, '&#39;');
6131
6134
  var dismissBtn = '<button class="we-service-alert-dismiss" onclick="WE._dismissAlert(\'' + safeId + '\')" title="Dismiss">&times;</button>';
6132
6135
  var actionBtn = '';
6133
- if (a.action_url && /^(\/|https?:\/\/)/.test(a.action_url)) {
6134
- actionBtn = ' <a href="' + esc(a.action_url) + '" class="we-service-alert-action">Fix</a>';
6136
+ var actionLabel = esc(a.action_label || 'Fix');
6137
+ if (a.action === 'repair_slack_owner') {
6138
+ var actionName = esc(a.action || 'custom').replace(/'/g, '&#39;');
6139
+ actionBtn = ' <button class="we-service-alert-action" onclick="WE._runAlertAction(\'' + safeId + '\', \'' + actionName + '\')">' + actionLabel + '</button>';
6140
+ } else if (a.action_url && /^(\/|https?:\/\/)/.test(a.action_url)) {
6141
+ actionBtn = ' <a href="' + esc(a.action_url) + '" class="we-service-alert-action">' + actionLabel + '</a>';
6135
6142
  }
6136
6143
  return '<div class="we-service-alert-item ' + kind + '">'
6137
6144
  + '<span class="we-service-alert-icon">' + icon + '</span>'
@@ -6150,6 +6157,31 @@ function renderServiceAlerts(alerts) {
6150
6157
  }
6151
6158
  }
6152
6159
 
6160
+ WE._runAlertAction = function(alertId, actionName) {
6161
+ if (actionName !== 'repair_slack_owner') return;
6162
+ resolveWalleBase().then(function() {
6163
+ var token = window._ctmState?.token || '';
6164
+ fetch(WALLE_BASE + '/api/wall-e/slack/repair-owner?token=' + encodeURIComponent(token), { method: 'POST' })
6165
+ .then(function(r) { return r.json().then(function(d) { return { ok: r.ok, data: d }; }); })
6166
+ .then(function(result) {
6167
+ if (result.ok && result.data && result.data.ok) {
6168
+ if (typeof showToast === 'function') showToast('Slack sync fixed automatically', 'var(--green, #9ece6a)', 2500);
6169
+ checkServiceAlerts();
6170
+ return;
6171
+ }
6172
+ var msg = (result.data && result.data.error) || 'Could not fix Slack sync automatically';
6173
+ if (result.data && result.data.needsSlackAuth) {
6174
+ if (typeof navTo === 'function') navTo('setup');
6175
+ msg = 'Connect Slack first, then Wall-E can finish setup automatically.';
6176
+ }
6177
+ if (typeof showToast === 'function') showToast(msg, 'var(--red, #f7768e)', 3500);
6178
+ })
6179
+ .catch(function(e) {
6180
+ if (typeof showToast === 'function') showToast(e.message, 'var(--red, #f7768e)', 3500);
6181
+ });
6182
+ });
6183
+ };
6184
+
6153
6185
  WE._dismissAlert = function(alertId) {
6154
6186
  resolveWalleBase().then(function() {
6155
6187
  var token = window._ctmState?.token || '';