Commit Graph

16 Commits

Author SHA1 Message Date
root
681b091e4a feat(migrate): migration_map idempotency ledger
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 22:18:05 +10:00
root
135244cb13 feat(actions): agent_actions table + repo
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 21:39:05 +10:00
root
e8dfc8f392 feat(agents): conversations.findOrCreateGlobal for space-less agents
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 21:04:31 +10:00
root
10a8b813a5 fix: crash-proofing + small robustness fixes
- pool.js: add pool.on('error') handler — an idle-client error (DB restart /
  .215 failover) previously crashed the process (no 'error' listener → throw)
- context tool: project a SAFE_COLUMNS allow-list for resources (never the
  monitoring/metadata JSON blobs); also add 'resource' to TABLE (was unhandled)
- applyPendingChange: guard the 'upsert' arm so a non-upsertable entity_type
  fails with a clear ValidationError instead of a bare TypeError

Tests: pool_error, context (resource case), pending_extended_actions (guard).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 00:17:15 +10:00
root
f80fd278a5 feat(db): conversations.findOrCreateForSpace for the ambient companion
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 18:08:34 +10:00
root
cf0510872e feat(db): migration 007 — conversations.space_id + seed companion agent
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 18:06:34 +10:00
root
10902bc6ac feat: real audit_log with redaction + pending_changes; replace stub 2026-05-31 11:04:53 +10:00
root
1b51c3c18d feat(schema): 005 — tags, entity_tags, entity_links, attachments 2026-05-31 11:02:14 +10:00
root
5e094f347e feat(schema): 004 — agents, agent_tokens, conversations, messages 2026-05-31 10:35:56 +10:00
root
6086cf9a7a fix(schema): tighten tenant boundaries on resources/deps/creds/source_docs
Apply same composite-FK pattern as 001/002 for migration 003:
- resources: add UNIQUE (id, space_id) as FK target.
- resource_dependencies: denormalize space_id, composite FKs on both endpoints
  (enforces both ends of a dep live in the same space at the DB layer).
- resource_credentials: denormalize space_id, composite FK to resources.
- source_docs.resource_id: NOT NULL (tenancy anchor); resource_id was already
  absent from the update FIELDS list so docs cannot move resources.

Repos derive space_id from the resource on addDependency/addCredential so callers
can't fake cross-tenant assignment. 3 regression tests added.
2026-05-31 10:33:17 +10:00
root
9dd944226d fix(schema): tighten tenant boundaries on pages/refs
Three security-review findings on migration 002:
- pages.space_id and refs.space_id changed to NOT NULL + ON DELETE CASCADE
  (was nullable + SET NULL, which allowed orphan rows surviving space deletion).
- pages.parent_id wrapped in composite FK (parent_id, space_id) -> pages(id, space_id)
  to prevent cross-space parent linkage (same pattern as tasks.project_id in 001).
- idx_refs_external promoted to UNIQUE on (space_id, source_kind, external_id);
  upsertByExternal now requires space_id and dedups per-space, not globally.

Added 3 regression tests covering composite FK rejection, CASCADE-on-space-delete,
and per-space dedup independence.
2026-05-31 02:21:47 +10:00
root
99d64221a0 feat(schema): 003 — resources, deps, credentials, source_docs 2026-05-31 02:18:39 +10:00
root
652f7c3894 feat(schema): 002 — pages, page_revisions, refs with FTS + vector indexes 2026-05-31 02:16:06 +10:00
root
3ca1509935 fix(schema): enforce cross-space FK on tasks.project_id via composite key
Security review flagged that tasks.project_id could reference a project in
a different space. Added composite FK (project_id, space_id) -> projects(id, space_id)
with ON DELETE SET NULL (project_id) so a deleted project leaves the task in
its space with project_id NULL rather than orphaning into a NULL space.

Added two regression tests: cross-space FK rejection + cascade behavior.
2026-05-31 02:14:20 +10:00
root
05ee9b3f41 feat(schema): 001 — spaces, projects, tasks with check constraints
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 02:07:15 +10:00
root
789ab8fca8 feat: db pool + migration runner with idempotency
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 02:05:53 +10:00