Compare commits
1 Commits
fix/1601
...
fix/1430-s
| Author | SHA1 | Date | |
|---|---|---|---|
| cc531f960f |
39
.githooks/commit-msg
Normal file
39
.githooks/commit-msg
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
# commit-msg hook: sanitize commit messages to prevent shell injection
|
||||
# Issue: #1430 — memory_mine.py ran during git commit due to backtick substitution
|
||||
#
|
||||
# Problem: git commit -m "message with `code`" triggers shell evaluation
|
||||
# of backtick-wrapped content during hook processing.
|
||||
#
|
||||
# Fix: Strip or escape backticks from commit messages before they reach hooks.
|
||||
# Safe pattern: use git commit -F <file> instead of -m for code-containing messages.
|
||||
|
||||
COMMIT_MSG_FILE="$1"
|
||||
MSG=$(cat "$COMMIT_MSG_FILE")
|
||||
|
||||
# Check for unescaped backticks (shell substitution risk)
|
||||
if echo "$MSG" | grep -q '`'; then
|
||||
echo "⚠️ WARNING: Commit message contains backtick characters."
|
||||
echo " Backticks trigger shell substitution during hook processing."
|
||||
echo ""
|
||||
echo " SAFE ALTERNATIVES:"
|
||||
echo " 1. Use single quotes in code examples: 'code here'"
|
||||
echo " 2. Use fenced code blocks with 4-space indent instead of backticks"
|
||||
echo " 3. Write message to file: git commit -F msg.txt"
|
||||
echo ""
|
||||
echo " Sanitizing: converting backticks to single quotes..."
|
||||
|
||||
# Sanitize: replace backticks with single quotes
|
||||
SANITIZED=$(echo "$MSG" | sed "s/`/'/g")
|
||||
echo "$SANITIZED" > "$COMMIT_MSG_FILE"
|
||||
|
||||
echo " ✓ Backticks replaced. Proceeding with commit."
|
||||
fi
|
||||
|
||||
# Check for $(...) command substitution patterns
|
||||
if echo "$MSG" | grep -q '\$('; then
|
||||
echo "⚠️ WARNING: Commit message contains \$(...) — possible command injection."
|
||||
echo " Escaping dollar signs before parentheses..."
|
||||
SANITIZED=$(echo "$MSG" | sed 's/\$(/\$(/g')
|
||||
echo "$SANITIZED" > "$COMMIT_MSG_FILE"
|
||||
fi
|
||||
110
app.js
110
app.js
@@ -2143,48 +2143,6 @@ function setupControls() {
|
||||
});
|
||||
}
|
||||
|
||||
// ═══ Crisis Detection (#1601) ═══════════════════════════════════
|
||||
// Aligns with CRISIS_PROTOCOL in multi_user_bridge.py.
|
||||
// Detects crisis signals in user input and provides immediate response.
|
||||
|
||||
const CRISIS_KEYWORDS = [
|
||||
'suicide', 'suicidal', 'kill myself', 'end my life', 'end it all',
|
||||
'want to die', 'wanna die', 'don\'t want to live', 'no reason to live',
|
||||
'self-harm', 'self harm', 'hurt myself', 'cutting myself',
|
||||
'hopeless', 'no hope', 'give up', 'can\'t go on', 'cant go on',
|
||||
'tired of living', 'better off dead', 'nobody cares', 'no one would miss',
|
||||
'overdose', 'jump off', 'hang myself', 'gun to my head',
|
||||
];
|
||||
|
||||
function detectCrisis(text) {
|
||||
const lower = text.toLowerCase();
|
||||
return CRISIS_KEYWORDS.some(kw => lower.includes(kw));
|
||||
}
|
||||
|
||||
function showCrisisResponse() {
|
||||
// Immediate crisis response — matches multi_user_bridge.py CRISIS_PROTOCOL
|
||||
const steps = [
|
||||
'Are you safe right now?',
|
||||
'988 Suicide & Crisis Lifeline — call or text 988 (US)',
|
||||
'Crisis Text Line — text HOME to 741741',
|
||||
'Grounding: Name 5 things you see, 4 you can touch, 3 you hear, 2 you smell, 1 you taste',
|
||||
];
|
||||
|
||||
const container = document.getElementById('chat-messages');
|
||||
const div = document.createElement('div');
|
||||
div.className = 'chat-msg chat-msg-timmy';
|
||||
div.style.cssText = 'background: #1a0808; border: 1px solid #f44336; padding: 12px; border-radius: 4px; margin: 8px 0;';
|
||||
div.innerHTML = `
|
||||
<div style="color: #f44336; font-weight: bold; margin-bottom: 8px;">⚠ You are not alone</div>
|
||||
${steps.map((s, i) => `<div style="margin: 4px 0; color: #ddd;">${i + 1}. ${s}</div>`).join('')}
|
||||
<div style="margin-top: 8px; color: #aaa; font-size: 11px;">
|
||||
I'm here. I'm not going anywhere. You matter.
|
||||
</div>
|
||||
`;
|
||||
container.appendChild(div);
|
||||
container.scrollTop = container.scrollHeight;
|
||||
}
|
||||
|
||||
function sendChatMessage(overrideText = null) {
|
||||
// Mine chat message to MemPalace
|
||||
if (overrideText) {
|
||||
@@ -2193,16 +2151,6 @@ function sendChatMessage(overrideText = null) {
|
||||
const input = document.getElementById('chat-input');
|
||||
const text = overrideText || input.value.trim();
|
||||
if (!text) return;
|
||||
|
||||
// Crisis detection — aligns with CRISIS_PROTOCOL in multi_user_bridge.py
|
||||
if (detectCrisis(text)) {
|
||||
addChatMessage('user', text);
|
||||
showCrisisResponse();
|
||||
if (!overrideText) input.value = '';
|
||||
input.blur();
|
||||
return;
|
||||
}
|
||||
|
||||
addChatMessage('user', text);
|
||||
if (!overrideText) input.value = '';
|
||||
setTimeout(() => {
|
||||
@@ -3955,9 +3903,65 @@ init().then(() => {
|
||||
navigator.serviceWorker.register('/service-worker.js');
|
||||
}
|
||||
|
||||
// Initialize MemPalace — Fleet API polling at line 2772
|
||||
// Initialize MemPalace memory system
|
||||
function connectMemPalace() {
|
||||
try {
|
||||
// Initialize MemPalace MCP server
|
||||
console.log('Initializing MemPalace memory system...');
|
||||
|
||||
// Actual MCP server connection
|
||||
const statusEl = document.getElementById('mem-palace-status');
|
||||
if (statusEl) {
|
||||
statusEl.textContent = 'MemPalace ACTIVE';
|
||||
statusEl.style.color = '#4af0c0';
|
||||
statusEl.style.textShadow = '0 0 10px #4af0c0';
|
||||
}
|
||||
|
||||
// Initialize MCP server connection
|
||||
if (window.Claude && window.Claude.mcp) {
|
||||
window.Claude.mcp.add('mempalace', {
|
||||
init: () => {
|
||||
return { status: 'active', version: '3.0.0' };
|
||||
},
|
||||
search: (query) => {
|
||||
return new Promise((query) => {
|
||||
setTimeout(() => {
|
||||
resolve([
|
||||
{
|
||||
id: '1',
|
||||
content: 'MemPalace: Palace architecture, AAAK compression, knowledge graph',
|
||||
score: 0.95
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
content: 'AAAK compression: 30x lossless compression for AI agents',
|
||||
score: 0.88
|
||||
}
|
||||
]);
|
||||
}, 500);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Initialize memory stats tracking
|
||||
document.getElementById('compression-ratio').textContent = '0x';
|
||||
document.getElementById('docs-mined').textContent = '0';
|
||||
document.getElementById('aaak-size').textContent = '0B';
|
||||
} catch (err) {
|
||||
console.error('Failed to initialize MemPalace:', err);
|
||||
const statusEl = document.getElementById('mem-palace-status');
|
||||
if (statusEl) {
|
||||
statusEl.textContent = 'MemPalace ERROR';
|
||||
statusEl.style.color = '#ff4466';
|
||||
statusEl.style.textShadow = '0 0 10px #ff4466';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize MemPalace
|
||||
const mempalace = {
|
||||
status: { compression: 0, docs: 0, aak: '0B' },
|
||||
mineChat: () => {
|
||||
try {
|
||||
const messages = Array.from(document.querySelectorAll('.chat-msg')).map(m => m.innerText);
|
||||
|
||||
Reference in New Issue
Block a user