mirror of
https://github.com/qwibitai/nanoclaw.git
synced 2026-06-04 10:14:47 +08:00
cc784ff94b
Drops the in-chat credential-collection flow introduced in e92b245. Agents
can no longer collect API keys via a secure modal — users must add secrets
through OneCLI directly. Keeps the OneCLI manual-approval handler and
threaded-routing work from the same commit intact.
Removed:
* container/agent-runner/src/mcp-tools/credentials.ts (MCP tool)
* src/credentials.ts (host-side modal/OneCLI pipeline)
* src/db/credentials.ts + migration 005 (pending_credentials table)
* src/onecli-secrets.ts (createSecret CLI facade, only caller was credentials.ts)
* findCredentialResponse from agent-runner DB layer
* PendingCredential types
* Four credential hooks from ChannelSetup (getCredentialForModal,
onCredentialReject, onCredentialSubmit, onCredentialChannelUnsupported)
* Credential card/modal handling in chat-sdk-bridge (nccr/nccm prefixes,
Modal/TextInput imports)
* credential_request text fallback in WhatsApp adapter
* request_credential system-action case in delivery.ts
Added:
* Migration 009 drops pending_credentials on existing installs.
Vercel skill now tells the agent to ask the user to register the token via
OneCLI instead of invoking the removed tool.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import type Database from 'better-sqlite3';
|
|
|
|
import { log } from '../../log.js';
|
|
import { migration001 } from './001-initial.js';
|
|
import { migration002 } from './002-chat-sdk-state.js';
|
|
import { migration003 } from './003-pending-approvals.js';
|
|
import { migration004 } from './004-agent-destinations.js';
|
|
import { migration007 } from './007-pending-approvals-title-options.js';
|
|
import { migration008 } from './008-dropped-messages.js';
|
|
import { migration009 } from './009-drop-pending-credentials.js';
|
|
|
|
export interface Migration {
|
|
version: number;
|
|
name: string;
|
|
up: (db: Database.Database) => void;
|
|
}
|
|
|
|
const migrations: Migration[] = [
|
|
migration001,
|
|
migration002,
|
|
migration003,
|
|
migration004,
|
|
migration007,
|
|
migration008,
|
|
migration009,
|
|
];
|
|
|
|
export function runMigrations(db: Database.Database): void {
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS schema_version (
|
|
version INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
applied TEXT NOT NULL
|
|
);
|
|
`);
|
|
|
|
const currentVersion =
|
|
(db.prepare('SELECT MAX(version) as v FROM schema_version').get() as { v: number | null })?.v ?? 0;
|
|
|
|
const pending = migrations.filter((m) => m.version > currentVersion);
|
|
if (pending.length === 0) return;
|
|
|
|
log.info('Running migrations', {
|
|
from: currentVersion,
|
|
to: pending[pending.length - 1].version,
|
|
count: pending.length,
|
|
});
|
|
|
|
for (const m of pending) {
|
|
db.transaction(() => {
|
|
m.up(db);
|
|
db.prepare('INSERT INTO schema_version (version, name, applied) VALUES (?, ?, ?)').run(
|
|
m.version,
|
|
m.name,
|
|
new Date().toISOString(),
|
|
);
|
|
})();
|
|
log.info('Migration applied', { version: m.version, name: m.name });
|
|
}
|
|
}
|