F1-F4: Inline editor AI - Backend: expand CopilotAction with fix-rewrite, change-tone, continue, explain - Backend: add tone parameter to copilot route for change-tone action - Web: copilot-client adds CopilotTone type and tone parameter - Web: NoteEditor toolbar gains AI row with Fix & Rewrite, Change Tone dropdown, Continue Writing (appends at cursor), Explain (inline popover) F15-F19: Mobile capture enhancements - Backend: POST /note-prompts/url-extract endpoint (fetch, strip HTML, LLM summarize) - Mobile API: extractFromUrl() and copilotTransform() client functions - Mobile: capture tab rewritten with 6 capture modes grid (text, photo, voice, URL, scan, paste) — URL extract + clipboard paste fully wired, camera/voice/scan surface native permission prompts (require expo-av/expo-image-picker) - expo-clipboard added as dependency F25-F27: Scheduled actions, webhook triggers, approval-gated actions - New scheduler.ts module with PromptScheduleDoc + PromptWebhookDoc types - Schedule CRUD: GET/POST/PATCH/DELETE /prompt-schedules - Webhook CRUD: GET/POST/PATCH/DELETE /prompt-webhooks - POST /prompt-webhooks/:id/trigger — execute template against note - Scheduler loop (60s tick) with cron next-run calculation - Diagnostics endpoint: GET /prompt-schedules/diagnostics - Cosmos containers: note_prompt_schedules, note_prompt_webhooks - PromptTemplateDoc gains requiresApproval field (F27) - Runner produces approvalState: proposed|applied based on template flag - Create/Update schemas accept requiresApproval boolean
34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import { initializeAllContainers, registerContainers } from '@bytelyst/cosmos';
|
|
import type { ContainerConfig } from '@bytelyst/cosmos';
|
|
import { config } from './config.js';
|
|
|
|
const CONTAINER_DEFS: Record<string, ContainerConfig> = {
|
|
notes: { partitionKeyPath: '/workspaceId' },
|
|
workspaces: { partitionKeyPath: '/userId' },
|
|
note_relationships: { partitionKeyPath: '/workspaceId' },
|
|
note_tasks: { partitionKeyPath: '/workspaceId' },
|
|
note_artifacts: { partitionKeyPath: '/workspaceId' },
|
|
note_agent_actions: { partitionKeyPath: '/workspaceId' },
|
|
saved_views: { partitionKeyPath: '/userId' },
|
|
note_prompts: { partitionKeyPath: '/userId' },
|
|
note_prompt_schedules: { partitionKeyPath: '/userId' },
|
|
note_prompt_webhooks: { partitionKeyPath: '/userId' },
|
|
};
|
|
|
|
export async function initCosmosIfNeeded(): Promise<void> {
|
|
registerContainers(CONTAINER_DEFS);
|
|
|
|
const shouldInit = config.NODE_ENV !== 'production' || process.env.COSMOS_AUTO_INIT === 'true';
|
|
if (!shouldInit || config.DB_PROVIDER === 'memory') {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await initializeAllContainers();
|
|
process.stdout.write('[notelett-backend] Cosmos containers ensured\n');
|
|
} catch (err) {
|
|
const msg = err instanceof Error ? err.message : String(err);
|
|
process.stderr.write(`[notelett-backend] Cosmos init failed: ${msg}\n`);
|
|
}
|
|
}
|