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.
- package/README.md +6 -1
- package/bin/create-walle.js +195 -30
- package/bin/mcp-inject.js +18 -53
- package/package.json +3 -1
- package/template/claude-task-manager/approval-agent.js +7 -0
- package/template/claude-task-manager/docs/session-standup-command-center-design.md +242 -0
- package/template/claude-task-manager/git-utils.js +111 -3
- package/template/claude-task-manager/lib/session-history.js +144 -16
- package/template/claude-task-manager/lib/session-standup.js +409 -0
- package/template/claude-task-manager/lib/standup-attention.js +200 -0
- package/template/claude-task-manager/lib/status-hooks.js +8 -2
- package/template/claude-task-manager/lib/update-telemetry.js +114 -0
- package/template/claude-task-manager/lib/walle-default-model.js +55 -0
- package/template/claude-task-manager/lib/walle-mcp-auto-config.js +62 -0
- package/template/claude-task-manager/lib/walle-supervisor.js +83 -19
- package/template/claude-task-manager/lib/worktree-cwd.js +82 -0
- package/template/claude-task-manager/providers/codex-mcp.js +104 -0
- package/template/claude-task-manager/providers/index.js +2 -0
- package/template/claude-task-manager/public/css/setup.css +2 -1
- package/template/claude-task-manager/public/css/walle.css +5 -0
- package/template/claude-task-manager/public/index.html +1596 -283
- package/template/claude-task-manager/public/js/session-search-utils.js +171 -1
- package/template/claude-task-manager/public/js/setup.js +62 -19
- package/template/claude-task-manager/public/js/stream-view.js +55 -6
- package/template/claude-task-manager/public/js/walle-session.js +73 -16
- package/template/claude-task-manager/public/js/walle.js +34 -2
- package/template/claude-task-manager/server.js +780 -177
- package/template/claude-task-manager/session-integrity.js +58 -15
- package/template/claude-task-manager/workers/approval-widget-validator.js +15 -5
- package/template/claude-task-manager/workers/state-detectors/codex.js +6 -0
- package/template/package.json +1 -1
- package/template/wall-e/agent.js +36 -7
- package/template/wall-e/api-walle.js +72 -20
- package/template/wall-e/coding/stream-processor.js +22 -2
- package/template/wall-e/coding-orchestrator.js +26 -6
- package/template/wall-e/eval/agent-runner.js +16 -4
- package/template/wall-e/eval/benchmark-generator.js +21 -1
- package/template/wall-e/eval/benchmarks/coding-agent.json +0 -596
- package/template/wall-e/eval/codex-cli-baseline.js +633 -0
- package/template/wall-e/eval/eval-orchestrator.js +3 -3
- package/template/wall-e/eval/run-agent-benchmarks.js +11 -3
- package/template/wall-e/eval/run-codex-cli-baseline.js +177 -0
- package/template/wall-e/lib/mcp-integration.js +220 -0
- package/template/wall-e/llm/ollama.js +47 -8
- package/template/wall-e/llm/ollama.plugin.json +1 -1
- package/template/wall-e/llm/tool-adapter.js +1 -0
- package/template/wall-e/loops/ingest.js +42 -8
- package/template/wall-e/mcp-server.js +272 -10
- package/template/wall-e/memory/ctm-session-context.js +910 -0
- package/template/wall-e/server.js +26 -1
- package/template/wall-e/skills/_bundled/scan-ctm-sessions/SKILL.md +20 -0
- package/template/wall-e/skills/_bundled/scan-ctm-sessions/run.js +43 -0
- package/template/wall-e/skills/skill-planner.js +52 -3
- package/template/wall-e/tools/builtin-middleware.js +55 -2
- package/template/wall-e/tools/shell-policy.js +1 -1
- package/template/wall-e/tools/slack-owner.js +104 -0
- package/template/website/index.html +2 -2
- 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
|
|
498
|
+
// Send via WebSocket (include model/provider when the session is pinned)
|
|
479
499
|
var model = ws.selectedModel || '';
|
|
480
|
-
|
|
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 (
|
|
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) {
|
|
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
|
-
|
|
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
|
-
|
|
750
|
-
return
|
|
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
|
-
|
|
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 && !
|
|
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 (
|
|
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
|
-
|
|
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, ''');
|
|
6131
6134
|
var dismissBtn = '<button class="we-service-alert-dismiss" onclick="WE._dismissAlert(\'' + safeId + '\')" title="Dismiss">×</button>';
|
|
6132
6135
|
var actionBtn = '';
|
|
6133
|
-
|
|
6134
|
-
|
|
6136
|
+
var actionLabel = esc(a.action_label || 'Fix');
|
|
6137
|
+
if (a.action === 'repair_slack_owner') {
|
|
6138
|
+
var actionName = esc(a.action || 'custom').replace(/'/g, ''');
|
|
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 || '';
|