Commit Graph

96 Commits

Author SHA1 Message Date
saravanakumardb1
ba89cfd643 refactor(embeddings): replace local cosineSimilarity with @bytelyst/palace re-export
Remove duplicate cosine similarity implementation in favor of the
shared @bytelyst/palace primitive. All consumers import from
embeddings.ts unchanged.
2026-04-13 12:33:52 -07:00
saravanakumardb1
7d7e445135 feat(prompts): inject palace wake-up context into Smart Actions
Enrich the system prompt with L0/L1/L2 workspace context from the
palace when running Smart Actions. Best-effort — failures never block
prompt execution. Gives LLM access to decisions, preferences, and
semantically relevant memories from the workspace.
2026-04-13 12:33:34 -07:00
saravanakumardb1
06590b9175 feat(palace): extract KG triples from entities + refresh L1 cache on note save
After storing memories, generate subject-predicate-object triples from
entity pairs found in extracted memories. Also trigger L1 critical facts
cache regeneration so wake-up context stays fresh.
2026-04-13 12:33:16 -07:00
saravanakumardb1
18b680ad53 fix(backend): fix sync throw isolation in event bus + add 6 tests
Promise.allSettled only catches rejected promises, not synchronous throws.
Wrap handler calls in Promise.resolve().then() to isolate sync errors.
Add 6 unit tests covering delivery, unsubscribe, error isolation,
singleton, reset, and removeAll.
2026-04-13 11:42:52 -07:00
saravanakumardb1
61de6ce94a feat(backend): wire @bytelyst/webhook-dispatch to domain event bus
- New lib/webhook-subscriber.ts: bridges event bus to webhook dispatch.
  Registers listeners on all 5 domain events (note.created, updated,
  deleted, task.created, workspace.created). Dispatches to registered
  targets with HMAC-SHA256 signing, retry, and delivery log.
- server.ts: init webhook subscriber on startup, stop on close.
- Adds @bytelyst/webhook-dispatch dependency.
2026-04-13 10:29:43 -07:00
saravanakumardb1
190d23280f feat(backend): add domain event bus and wire note CRUD events
- New lib/event-bus.ts: lightweight typed pub/sub with error isolation
  via Promise.allSettled. Supports note.created, note.updated,
  note.deleted, task.created, workspace.created events.
- notes/repository.ts: emit events on create, update, and delete.
- .env.example: add TELEMETRY_ENABLED, FEATURE_FLAGS_ENABLED,
  FIELD_ENCRYPT_ENABLED, PALACE_ENABLED, PALACE_EXTRACTION_ENABLED.
2026-04-13 10:00:12 -07:00
saravanakumardb1
4246d58798 fix(docker): switch Alpine to Debian slim and remove prod NODE_TLS_REJECT_UNAUTHORIZED
Alpine breaks under corporate proxy TLS interception. Debian slim
works reliably. NODE_TLS_REJECT_UNAUTHORIZED=0 removed from production
stages — only kept in build stages where npm registries need it.
2026-04-13 09:59:36 -07:00
saravanakumardb1
3a229c5b42 fix(backend): convert @bytelyst/llm and @bytelyst/palace from file: refs to Gitea registry
Both packages are published to Gitea (llm@0.1.5, palace@0.1.4).
File refs broke Docker builds and caused 8 test files to fail due to
stale dist/providers/fallback.js.

Also removes unused @bytelyst/events dependency (not on Gitea registry).
2026-04-13 09:58:59 -07:00
saravanakumardb1
ddb5bfb49a chore(deps): use wildcard (*) for @bytelyst/* internal packages
All @bytelyst/* packages are internal to the ByteLyst ecosystem and
published to the private Gitea registry. Using "*" eliminates version
bump noise — always resolves to latest available.
2026-04-13 01:05:35 -07:00
saravanakumardb1
1bf9896ea9 fix(palace): pass stripped plainText to extractor instead of raw HTML 2026-04-10 01:42:00 -07:00
saravanakumardb1
1ae35a7e21 fix(palace): wire palace MCP tools into register-note-tools registry 2026-04-10 01:41:28 -07:00
saravanakumardb1
97662d1dc0 fix(palace): deleteMemory now decrements wing/room memoryCount 2026-04-10 01:40:34 -07:00
saravanakumardb1
c7c1ebad74 feat(palace): MCP memory tools — search, store, wake-up, KG query, timeline, list wings (N6) 2026-04-10 01:37:31 -07:00
saravanakumardb1
be2f4ff0ad feat(palace): REST API routes with search, CRUD, KG, wake-up, maintenance (N5) 2026-04-10 01:35:20 -07:00
saravanakumardb1
31bdb0ada9 feat(palace): knowledge graph triple CRUD with temporal queries, contradiction detection (N3) 2026-04-10 01:30:02 -07:00
saravanakumardb1
a5dbeac77e feat(palace): wake-up context builder with L0/L1/L2 layers, L1 cache regeneration (N2) 2026-04-10 01:27:13 -07:00
saravanakumardb1
0af5f875bb feat(palace): auto-save hooks — extract memories on note create/update (N4) 2026-04-10 01:25:00 -07:00
saravanakumardb1
632b5df1ac feat(palace): add 30 tests with cross-user isolation, fix extractor regex fallback 2026-04-10 01:19:35 -07:00
saravanakumardb1
13020bc72f feat(palace): add LLM memory extractor with regex fallback 2026-04-10 01:16:55 -07:00
saravanakumardb1
44d8867aa5 feat(palace): add user-isolated repository with CRUD, search, dedup, prune, encryption 2026-04-10 01:15:41 -07:00
saravanakumardb1
38006af1a3 feat(palace): add @bytelyst/palace dep, palace types, 6 cosmos containers, config vars 2026-04-10 01:14:00 -07:00
saravanakumardb1
b7bdfd97bc fix(test): resolve all TS lint errors in note-collaborators routes test — properly typed mock fns 2026-04-06 20:56:20 -07:00
saravanakumardb1
338e80fc33 fix(intake): support comma-separated status filter in GET /intake/jobs — fixes mobile polling contract mismatch 2026-04-06 20:48:26 -07:00
saravanakumardb1
599d68e116 feat(sharing): add collaborative shares, export-text, deep-link helper — note-collaborators module (11 new tests) 2026-04-06 20:31:31 -07:00
saravanakumardb1
0e16714da1 feat(intake): add URL intake pipeline — classifier, extractors, rules engine, routes, 6 new prompt templates (27 total), 26 new tests 2026-04-06 20:28:36 -07:00
saravanakumardb1
6f262a5218 fix: register missing note_shares+note_versions containers, add multi-note input type 2026-04-06 20:20:12 -07:00
saravanakumardb1
18646fac6d fix(tests): fix all failing tests — server mock, ecosystem schema stubs, CreateNoteModal body assertion 2026-04-06 19:13:35 -07:00
saravanakumardb1
96015be313 fix: add /userId partition key to scheduler schedule+webhook collections 2026-04-06 16:29:24 -07:00
saravanakumardb1
192c7baf2f fix: align web+mobile types with backend (categories, output types, field names, durationMs telemetry) 2026-04-06 16:24:31 -07:00
saravanakumardb1
6095f1d985 feat(smart-actions): add prompt-result screen, capture sub-routes, Cmd+Shift+A shortcut, telemetry events (G16-G19) 2026-04-06 13:43:47 -07:00
saravanakumardb1
4fd6994fb0 test(web): add prompt-client, SmartActionsPanel, RunPromptModal, NoteEditor tests (G10-G13) 2026-04-06 13:34:04 -07:00
saravanakumardb1
2a7cfbb73e test(backend): add runner, reading-time, copilot-transform, note-hooks tests (G6-G9) 2026-04-06 13:29:33 -07:00
saravanakumardb1
093da76eee feat(smart-actions): add run-stream SSE, history endpoint, weekly-digest template, web client functions (G1-G5) 2026-04-06 13:27:02 -07:00
saravanakumardb1
6bff2d3e2e chore(devops): add LLM env vars to .env.example, docker-compose, docker-prep 2026-04-06 11:15:36 -07:00
saravanakumardb1
e9f389a8b7 feat(backend): add 11 telemetry events for Smart Actions 2026-04-06 11:13:50 -07:00
saravanakumardb1
1b4b5af995 feat(backend): register 8 Smart Actions feature flags with route gating 2026-04-06 11:11:25 -07:00
saravanakumardb1
c71b01681f fix(backend): harden LLM error handling — retry, timeout, missing key guards 2026-04-06 11:09:08 -07:00
saravanakumardb1
b8bc096adb test(smart-actions): add scheduler, webhook, copilot integration tests 2026-04-06 11:05:42 -07:00
saravanakumardb1
f2c3258b53 fix(backend): review fixes — persist requiresApproval, shutdown hook, productId check, GET by ID
- repository.ts: persist requiresApproval field in createPromptTemplate (was silently dropped)
- server.ts: register onClose hook to call stopSchedulerLoop() on graceful shutdown
- scheduler.ts: add productId check in webhook trigger note lookup
- scheduler.ts: add GET /prompt-schedules/:id and GET /prompt-webhooks/:id endpoints
2026-04-06 10:45:03 -07:00
saravanakumardb1
3260b7ea0a feat(smart-actions): F1-F4 inline editor AI, F15-F19 mobile capture modes, F25-F27 scheduler/webhooks/approval
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
2026-04-06 10:25:34 -07:00
saravanakumardb1
511c36d87e feat(mcp): add Smart Action MCP tools — suggest_tags, check_duplicates, suggest_links
Phase 5 of Smart Actions Roadmap — Agent & workflow intelligence:

- Add 3 new MCP tool contracts to note-tool-contracts.ts:
  - notes.intelligence.suggest_tags: LLM-powered tag suggestion
  - notes.intelligence.check_duplicates: embedding-based duplicate detection
  - notes.intelligence.suggest_links: embedding-based related note suggestions
- Add Zod schemas and SmartActionMcpToolDefinitions export
- Implement executeSuggestTags, executeCheckDuplicates, executeSuggestLinks
- Wire all 3 into NotesExecutableMcpTools array (now 11 tools total)
- Update note-tools.test.ts to expect 11 tool names
- All 131 tests pass, typecheck clean
2026-04-06 08:45:38 -07:00
saravanakumardb1
fe3b0f9b3e feat(backend): add note intelligence — embeddings, auto-summarize, duplicates, suggest-links, knowledge gaps
Phase 2 of Smart Actions Roadmap:

- Create lib/embeddings.ts: embedText(), cosineSimilarity(), stripHtmlForEmbedding()
- Add embedding + summaryArtifactId fields to NoteDoc
- Create lib/note-hooks.ts: runPostSaveHooks() for background AI enrichment
  - backgroundEmbed: compute and store note embedding vectors
  - backgroundAutoSummarize: generate summary artifact for notes > 300 words
  - Both gated behind feature flags (notelett_auto_embed_enabled, notelett_auto_summarize_enabled)
- Add intelligence endpoints to note-prompts routes:
  - POST /api/notes/:id/suggest-tags (F5) — LLM-generated tag suggestions
  - POST /api/notes/:id/check-duplicates (F8) — cosine similarity duplicate detection
  - POST /api/notes/:id/suggest-links (F9) — related note suggestions
  - POST /api/workspaces/:wsId/knowledge-gaps (F12) — workspace gap analysis
  - POST /api/notes/compare (F14) — multi-note comparison
  - POST /api/notes/merge (F13) — multi-note merge
- Add 4 feature flags for intelligence features
- 9 new tests in embeddings.test.ts (cosine similarity, HTML stripping, embedText)
2026-04-06 08:10:26 -07:00
saravanakumardb1
9e3a7206b9 feat(backend): add note-prompts module with Smart Actions LLM integration
- Add @bytelyst/llm dependency (file: ref) + llm.ts singleton wrapper
- Add LLM env vars to config (LLM_PROVIDER, LLM_DEFAULT_MODEL, LLM_VISION_MODEL, LLM_EMBEDDING_MODEL)
- Create note-prompts module: types, repository, runner, routes, seed (20 built-in templates)
- Built-in templates: 8 transform, 3 extract, 3 generate, 2 analyze, 2 vision, 2 export
- Prompt runner supports text, image, and text+image inputs via @bytelyst/llm vision
- Upgrade copilot-transform.ts to use @bytelyst/llm directly (with local heuristic fallback)
- Add reading-time endpoint (GET /api/notes/:id/reading-time)
- Extend agent-action types with smart_action and auto_enrich
- Add note_prompts Cosmos container to cosmos-init
- Register notePromptRoutes in server.ts
- 15 new tests (CRUD, run, slug resolution, seed validation, reading-time)
2026-04-06 08:01:42 -07:00
7ee2151f17 feat(phase3): wire notelett trail import route 2026-04-04 00:33:38 -07:00
4af86b43f7 feat(phase3): add notelett trail report import 2026-04-03 19:49:46 -07:00
saravanakumardb1
623d02c32f test(notes): verify phase1 transcript→note import against @bytelyst/events schemas
- Add @bytelyst/events dependency for contract validation
- Expand ecosystem-phase1 tests from 1 to 13 focused tests:
  - transcript artifact import from disk
  - transcript capture event load + missing file graceful
  - note creation with productId, sourceType, links, tags
  - note artifact doc for internal persistence
  - artifact.created event with upstream causation propagation
  - artifact.linked event chained from artifact.created
  - provenance lineage preservation (lysnrai→notelett)
  - NoteArtifactEnvelopeSchema conformance (no contract drift)
  - ArtifactCreatedEventSchema conformance
  - ArtifactLinkedEventSchema conformance
  - disk persistence + index file verification
  - graceful degradation without capture event
- Fix server.test.ts route count (7→8) for ecosystem-phase1 route
2026-04-03 19:13:55 -07:00
9ecc7c6bf5 fix(notes): preserve phase1 transcript event lineage 2026-04-03 17:40:59 -07:00
6ffc2f8755 feat(notes): import phase1 transcript artifacts 2026-04-03 16:36:54 -07:00
8d8540e320 fix(note-shares): treat expired shares as not found
findShareByToken now returns null when expiresAt is in the past, aligning the public share API with stored metadata.

Add unit tests for expiry, future expiry, missing expiry, and no match.

Made-with: Cursor
2026-03-31 13:05:30 -07:00
5e3e374d3a fix(notes): export route order and lexical snippet ellipsis
Register GET /notes/export before GET /notes/:id so the path is not captured as an id.

Compute search snippets from stripped plain text so the trailing ellipsis matches visible length, not raw HTML length.

Made-with: Cursor
2026-03-31 13:05:29 -07:00