mcpscraper-memory-db 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/db/chat-link.d.ts +7 -0
- package/dist/db/chat-link.js +50 -0
- package/dist/db/chat-link.js.map +1 -0
- package/dist/db/facts.d.ts +60 -0
- package/dist/db/facts.js +186 -0
- package/dist/db/facts.js.map +1 -0
- package/dist/db/interlink-state.d.ts +34 -0
- package/dist/db/interlink-state.js +42 -0
- package/dist/db/interlink-state.js.map +1 -0
- package/dist/db/keys.d.ts +44 -0
- package/dist/db/keys.js +118 -0
- package/dist/db/keys.js.map +1 -0
- package/dist/db/messages.d.ts +77 -0
- package/dist/db/messages.js +198 -0
- package/dist/db/messages.js.map +1 -0
- package/dist/db/notes.d.ts +109 -0
- package/dist/db/notes.js +249 -0
- package/dist/db/notes.js.map +1 -0
- package/dist/db/pool.d.ts +7 -0
- package/dist/db/pool.js +37 -0
- package/dist/db/pool.js.map +1 -0
- package/dist/db/presence.d.ts +4 -0
- package/dist/db/presence.js +25 -0
- package/dist/db/presence.js.map +1 -0
- package/dist/db/props-snapshots.d.ts +18 -0
- package/dist/db/props-snapshots.js +37 -0
- package/dist/db/props-snapshots.js.map +1 -0
- package/dist/db/provenance.d.ts +26 -0
- package/dist/db/provenance.js +43 -0
- package/dist/db/provenance.js.map +1 -0
- package/dist/db/schedule-entitlements.d.ts +24 -0
- package/dist/db/schedule-entitlements.js +70 -0
- package/dist/db/schedule-entitlements.js.map +1 -0
- package/dist/db/schedule-link.d.ts +7 -0
- package/dist/db/schedule-link.js +50 -0
- package/dist/db/schedule-link.js.map +1 -0
- package/dist/db/scheduled-actions.d.ts +58 -0
- package/dist/db/scheduled-actions.js +139 -0
- package/dist/db/scheduled-actions.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.js +340 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/secure-notes.d.ts +26 -0
- package/dist/db/secure-notes.js +59 -0
- package/dist/db/secure-notes.js.map +1 -0
- package/dist/db/shares.d.ts +45 -0
- package/dist/db/shares.js +141 -0
- package/dist/db/shares.js.map +1 -0
- package/dist/db/tables.d.ts +50 -0
- package/dist/db/tables.js +226 -0
- package/dist/db/tables.js.map +1 -0
- package/dist/db/trust.d.ts +10 -0
- package/dist/db/trust.js +88 -0
- package/dist/db/trust.js.map +1 -0
- package/dist/db/usage.d.ts +30 -0
- package/dist/db/usage.js +106 -0
- package/dist/db/usage.js.map +1 -0
- package/dist/db/vaults.d.ts +98 -0
- package/dist/db/vaults.js +316 -0
- package/dist/db/vaults.js.map +1 -0
- package/dist/db/video-runs.d.ts +70 -0
- package/dist/db/video-runs.js +176 -0
- package/dist/db/video-runs.js.map +1 -0
- package/dist/db/webhooks.d.ts +20 -0
- package/dist/db/webhooks.js +43 -0
- package/dist/db/webhooks.js.map +1 -0
- package/dist/lib/auth.d.ts +75 -0
- package/dist/lib/auth.js +248 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/cost-rates.d.ts +19 -0
- package/dist/lib/cost-rates.js +36 -0
- package/dist/lib/cost-rates.js.map +1 -0
- package/dist/lib/credit-debit.d.ts +15 -0
- package/dist/lib/credit-debit.js +21 -0
- package/dist/lib/credit-debit.js.map +1 -0
- package/dist/lib/operator.d.ts +5 -0
- package/dist/lib/operator.js +14 -0
- package/dist/lib/operator.js.map +1 -0
- package/dist/lib/schedule-cadence.d.ts +6 -0
- package/dist/lib/schedule-cadence.js +66 -0
- package/dist/lib/schedule-cadence.js.map +1 -0
- package/dist/lib/secret-crypto.d.ts +4 -0
- package/dist/lib/secret-crypto.js +28 -0
- package/dist/lib/secret-crypto.js.map +1 -0
- package/dist/lib/vault-contracts.d.ts +18 -0
- package/dist/lib/vault-contracts.js +248 -0
- package/dist/lib/vault-contracts.js.map +1 -0
- package/dist/lib/video-reaper.d.ts +13 -0
- package/dist/lib/video-reaper.js +19 -0
- package/dist/lib/video-reaper.js.map +1 -0
- package/dist/rag/embedder.d.ts +6 -0
- package/dist/rag/embedder.js +93 -0
- package/dist/rag/embedder.js.map +1 -0
- package/dist/rag/index-pipeline.d.ts +22 -0
- package/dist/rag/index-pipeline.js +62 -0
- package/dist/rag/index-pipeline.js.map +1 -0
- package/dist/rag/query-tool.d.ts +47 -0
- package/dist/rag/query-tool.js +47 -0
- package/dist/rag/query-tool.js.map +1 -0
- package/dist/rag/vector-store.d.ts +7 -0
- package/dist/rag/vector-store.js +25 -0
- package/dist/rag/vector-store.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/scheduled-actions.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { ensureSchema, query } from './pool'\nimport type { ScheduleCadence } from '../lib/schedule-cadence'\n\nexport type ScheduledActionStatus = 'active' | 'paused' | 'deleted' | 'completed'\n\nexport interface ScheduledActionRecord {\n id: string\n identity: string\n description: string\n vault: string\n cadence: ScheduleCadence\n timeOfDay: string | null\n timezone: string\n status: ScheduledActionStatus\n nextRunAt: string\n lastRunAt: string | null\n lastRunStatus: string | null\n createdAt: string\n updatedAt: string\n system: string | null\n}\n\ninterface RawRow {\n id: string\n identity: string\n description: string\n vault: string\n cadence: string\n time_of_day: string | null\n timezone: string\n status: string\n next_run_at: string\n last_run_at: string | null\n last_run_status: string | null\n created_at: string\n updated_at: string\n system: string | null\n}\n\nfunction mapRow(r: RawRow): ScheduledActionRecord {\n return {\n id: r.id,\n identity: r.identity,\n description: r.description,\n vault: r.vault,\n cadence: r.cadence as ScheduleCadence,\n timeOfDay: r.time_of_day,\n timezone: r.timezone,\n status: r.status as ScheduledActionStatus,\n nextRunAt: r.next_run_at,\n lastRunAt: r.last_run_at,\n lastRunStatus: r.last_run_status,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n system: r.system,\n }\n}\n\nconst COLUMNS = 'id, identity, description, vault, cadence, time_of_day, timezone, status, next_run_at, last_run_at, last_run_status, created_at, updated_at, system'\n\nexport async function createScheduledAction(args: {\n identity: string\n description: string\n vault: string\n cadence: ScheduleCadence\n timeOfDay?: string | null\n timezone?: string | null\n nextRunAt: string\n system?: string | null\n}): Promise<ScheduledActionRecord> {\n await ensureSchema()\n const id = randomUUID()\n const res = await query<RawRow>(\n `INSERT INTO mem_scheduled_actions (id, identity, description, vault, cadence, time_of_day, timezone, status, next_run_at, system)\n VALUES ($1, $2, $3, $4, $5, $6, $7, 'active', $8, $9)\n RETURNING ${COLUMNS}`,\n [id, args.identity, args.description, args.vault, args.cadence, args.timeOfDay ?? null, args.timezone ?? 'UTC', args.nextRunAt, args.system ?? null],\n )\n return mapRow(res.rows[0])\n}\n\nexport async function getSystemScheduledAction(identity: string, system: string): Promise<ScheduledActionRecord | null> {\n await ensureSchema()\n const res = await query<RawRow>(\n `SELECT ${COLUMNS} FROM mem_scheduled_actions WHERE identity = $1 AND system = $2 AND status != 'deleted' LIMIT 1`,\n [identity, system],\n )\n return res.rows[0] ? mapRow(res.rows[0]) : null\n}\n\nexport async function getScheduledAction(id: string, identity: string): Promise<ScheduledActionRecord | null> {\n await ensureSchema()\n const res = await query<RawRow>(\n `SELECT ${COLUMNS} FROM mem_scheduled_actions WHERE id = $1 AND identity = $2 AND status != 'deleted' LIMIT 1`,\n [id, identity],\n )\n return res.rows[0] ? mapRow(res.rows[0]) : null\n}\n\nexport async function listScheduledActionsForIdentity(identity: string): Promise<ScheduledActionRecord[]> {\n await ensureSchema()\n const res = await query<RawRow>(\n `SELECT ${COLUMNS} FROM mem_scheduled_actions WHERE identity = $1 AND status != 'deleted' ORDER BY created_at DESC`,\n [identity],\n )\n return res.rows.map(mapRow)\n}\n\nexport async function patchScheduledAction(args: {\n id: string\n identity: string\n status?: 'active' | 'paused'\n description?: string\n cadence?: ScheduleCadence\n timeOfDay?: string | null\n timezone?: string | null\n nextRunAt?: string\n}): Promise<ScheduledActionRecord | null> {\n await ensureSchema()\n const sets: string[] = []\n const params: unknown[] = []\n if (args.status !== undefined) { params.push(args.status); sets.push(`status = $${params.length}`) }\n if (args.description !== undefined) { params.push(args.description); sets.push(`description = $${params.length}`) }\n if (args.cadence !== undefined) { params.push(args.cadence); sets.push(`cadence = $${params.length}`) }\n if (args.timeOfDay !== undefined) { params.push(args.timeOfDay); sets.push(`time_of_day = $${params.length}`) }\n if (args.timezone !== undefined) { params.push(args.timezone); sets.push(`timezone = $${params.length}`) }\n if (args.nextRunAt !== undefined) { params.push(args.nextRunAt); sets.push(`next_run_at = $${params.length}`) }\n if (sets.length === 0) return getScheduledAction(args.id, args.identity)\n sets.push('updated_at = now()')\n params.push(args.id, args.identity)\n const res = await query<RawRow>(\n `UPDATE mem_scheduled_actions SET ${sets.join(', ')}\n WHERE id = $${params.length - 1} AND identity = $${params.length} AND status != 'deleted'\n RETURNING ${COLUMNS}`,\n params,\n )\n return res.rows[0] ? mapRow(res.rows[0]) : null\n}\n\nexport type DeleteScheduledActionResult =\n | { deleted: true }\n | { deleted: false; reason: 'not_found' | 'system' }\n\nexport async function deleteScheduledAction(id: string, identity: string): Promise<DeleteScheduledActionResult> {\n await ensureSchema()\n const existing = await getScheduledAction(id, identity)\n if (!existing) return { deleted: false, reason: 'not_found' }\n if (existing.system) return { deleted: false, reason: 'system' }\n const res = await query(\n `UPDATE mem_scheduled_actions SET status = 'deleted', updated_at = now() WHERE id = $1 AND identity = $2 AND status != 'deleted'`,\n [id, identity],\n )\n return (res.rowCount ?? 0) > 0 ? { deleted: true } : { deleted: false, reason: 'not_found' }\n}\n\nexport async function listDueScheduledActions(nowIso: string, limit: number): Promise<ScheduledActionRecord[]> {\n await ensureSchema()\n const res = await query<RawRow>(\n `SELECT ${COLUMNS} FROM mem_scheduled_actions WHERE status = 'active' AND next_run_at <= $1 ORDER BY next_run_at ASC LIMIT $2`,\n [nowIso, limit],\n )\n return res.rows.map(mapRow)\n}\n\nexport async function markScheduledActionRan(id: string, args: { lastRunAt: string; nextRunAt: string; lastRunStatus: string; status?: ScheduledActionStatus }): Promise<void> {\n await ensureSchema()\n if (args.status !== undefined) {\n await query(\n `UPDATE mem_scheduled_actions SET last_run_at = $2, next_run_at = $3, last_run_status = $4, status = $5, updated_at = now() WHERE id = $1`,\n [id, args.lastRunAt, args.nextRunAt, args.lastRunStatus, args.status],\n )\n return\n }\n await query(\n `UPDATE mem_scheduled_actions SET last_run_at = $2, next_run_at = $3, last_run_status = $4, updated_at = now() WHERE id = $1`,\n [id, args.lastRunAt, args.nextRunAt, args.lastRunStatus],\n )\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,cAAc,aAAa;AAuCpC,SAAS,OAAO,GAAkC;AAChD,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,UAAU,EAAE;AAAA,IACZ,aAAa,EAAE;AAAA,IACf,OAAO,EAAE;AAAA,IACT,SAAS,EAAE;AAAA,IACX,WAAW,EAAE;AAAA,IACb,UAAU,EAAE;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,IACb,eAAe,EAAE;AAAA,IACjB,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,EACZ;AACF;AAEA,MAAM,UAAU;AAEhB,eAAsB,sBAAsB,MAST;AACjC,QAAM,aAAa;AACnB,QAAM,KAAK,WAAW;AACtB,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA;AAAA,iBAEa,OAAO;AAAA,IACpB,CAAC,IAAI,KAAK,UAAU,KAAK,aAAa,KAAK,OAAO,KAAK,SAAS,KAAK,aAAa,MAAM,KAAK,YAAY,OAAO,KAAK,WAAW,KAAK,UAAU,IAAI;AAAA,EACrJ;AACA,SAAO,OAAO,IAAI,KAAK,CAAC,CAAC;AAC3B;AAEA,eAAsB,yBAAyB,UAAkB,QAAuD;AACtH,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,CAAC,UAAU,MAAM;AAAA,EACnB;AACA,SAAO,IAAI,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI;AAC7C;AAEA,eAAsB,mBAAmB,IAAY,UAAyD;AAC5G,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,CAAC,IAAI,QAAQ;AAAA,EACf;AACA,SAAO,IAAI,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI;AAC7C;AAEA,eAAsB,gCAAgC,UAAoD;AACxG,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,CAAC,QAAQ;AAAA,EACX;AACA,SAAO,IAAI,KAAK,IAAI,MAAM;AAC5B;AAEA,eAAsB,qBAAqB,MASD;AACxC,QAAM,aAAa;AACnB,QAAM,OAAiB,CAAC;AACxB,QAAM,SAAoB,CAAC;AAC3B,MAAI,KAAK,WAAW,QAAW;AAAE,WAAO,KAAK,KAAK,MAAM;AAAG,SAAK,KAAK,aAAa,OAAO,MAAM,EAAE;AAAA,EAAE;AACnG,MAAI,KAAK,gBAAgB,QAAW;AAAE,WAAO,KAAK,KAAK,WAAW;AAAG,SAAK,KAAK,kBAAkB,OAAO,MAAM,EAAE;AAAA,EAAE;AAClH,MAAI,KAAK,YAAY,QAAW;AAAE,WAAO,KAAK,KAAK,OAAO;AAAG,SAAK,KAAK,cAAc,OAAO,MAAM,EAAE;AAAA,EAAE;AACtG,MAAI,KAAK,cAAc,QAAW;AAAE,WAAO,KAAK,KAAK,SAAS;AAAG,SAAK,KAAK,kBAAkB,OAAO,MAAM,EAAE;AAAA,EAAE;AAC9G,MAAI,KAAK,aAAa,QAAW;AAAE,WAAO,KAAK,KAAK,QAAQ;AAAG,SAAK,KAAK,eAAe,OAAO,MAAM,EAAE;AAAA,EAAE;AACzG,MAAI,KAAK,cAAc,QAAW;AAAE,WAAO,KAAK,KAAK,SAAS;AAAG,SAAK,KAAK,kBAAkB,OAAO,MAAM,EAAE;AAAA,EAAE;AAC9G,MAAI,KAAK,WAAW,EAAG,QAAO,mBAAmB,KAAK,IAAI,KAAK,QAAQ;AACvE,OAAK,KAAK,oBAAoB;AAC9B,SAAO,KAAK,KAAK,IAAI,KAAK,QAAQ;AAClC,QAAM,MAAM,MAAM;AAAA,IAChB,oCAAoC,KAAK,KAAK,IAAI,CAAC;AAAA,mBACpC,OAAO,SAAS,CAAC,oBAAoB,OAAO,MAAM;AAAA,iBACpD,OAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO,IAAI,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI;AAC7C;AAMA,eAAsB,sBAAsB,IAAY,UAAwD;AAC9G,QAAM,aAAa;AACnB,QAAM,WAAW,MAAM,mBAAmB,IAAI,QAAQ;AACtD,MAAI,CAAC,SAAU,QAAO,EAAE,SAAS,OAAO,QAAQ,YAAY;AAC5D,MAAI,SAAS,OAAQ,QAAO,EAAE,SAAS,OAAO,QAAQ,SAAS;AAC/D,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA,CAAC,IAAI,QAAQ;AAAA,EACf;AACA,UAAQ,IAAI,YAAY,KAAK,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,SAAS,OAAO,QAAQ,YAAY;AAC7F;AAEA,eAAsB,wBAAwB,QAAgB,OAAiD;AAC7G,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,CAAC,QAAQ,KAAK;AAAA,EAChB;AACA,SAAO,IAAI,KAAK,IAAI,MAAM;AAC5B;AAEA,eAAsB,uBAAuB,IAAY,MAAsH;AAC7K,QAAM,aAAa;AACnB,MAAI,KAAK,WAAW,QAAW;AAC7B,UAAM;AAAA,MACJ;AAAA,MACA,CAAC,IAAI,KAAK,WAAW,KAAK,WAAW,KAAK,eAAe,KAAK,MAAM;AAAA,IACtE;AACA;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,IACA,CAAC,IAAI,KAAK,WAAW,KAAK,WAAW,KAAK,aAAa;AAAA,EACzD;AACF;","names":[]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const schemaSql = "\nCREATE TABLE IF NOT EXISTS mem_keys (\n key_id TEXT PRIMARY KEY,\n secret_hash TEXT NOT NULL,\n identity TEXT NOT NULL,\n vaults JSONB NOT NULL DEFAULT '[]'::jsonb,\n scope JSONB NOT NULL DEFAULT '{}'::jsonb,\n plan TEXT NOT NULL DEFAULT 'free',\n expires_at TIMESTAMPTZ,\n revoked BOOLEAN NOT NULL DEFAULT FALSE,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n last_used_at TIMESTAMPTZ,\n usage_count INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS mem_keys_secret_hash_idx ON mem_keys (secret_hash);\nCREATE INDEX IF NOT EXISTS mem_keys_identity_idx ON mem_keys (identity);\n\nCREATE TABLE IF NOT EXISTS mem_provenance (\n id BIGSERIAL PRIMARY KEY,\n key_id TEXT,\n identity TEXT NOT NULL,\n session TEXT,\n op TEXT NOT NULL,\n target TEXT,\n detail JSONB NOT NULL DEFAULT '{}'::jsonb,\n ts TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_provenance_identity_idx ON mem_provenance (identity);\nCREATE INDEX IF NOT EXISTS mem_provenance_ts_idx ON mem_provenance (ts);\n\nCREATE TABLE IF NOT EXISTS mem_vault_registry (\n id BIGSERIAL PRIMARY KEY,\n grantee TEXT NOT NULL,\n vault TEXT NOT NULL,\n owner_identity TEXT NOT NULL,\n entitlement JSONB NOT NULL DEFAULT '{}'::jsonb,\n shared BOOLEAN NOT NULL DEFAULT FALSE,\n precedence_default TEXT DEFAULT 'recency',\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (grantee, vault)\n);\nCREATE INDEX IF NOT EXISTS mem_vault_registry_grantee_idx ON mem_vault_registry (grantee);\nALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS precedence_default TEXT DEFAULT 'recency';\nALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS contract JSONB;\n\nCREATE TABLE IF NOT EXISTS mem_sessions (\n session_id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n active_vault TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\n-- Owner-qualified addressing for shared vaults: a grantee addresses a vault by\n-- its handle (own vaults = bare name, shared vaults = \"owner/Name\"). Re-key the\n-- registry on (grantee, handle) so a shared vault can coexist with an own vault\n-- of the same name without colliding.\nALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS handle TEXT;\nUPDATE mem_vault_registry SET handle = vault WHERE handle IS NULL;\nALTER TABLE mem_vault_registry DROP CONSTRAINT IF EXISTS mem_vault_registry_grantee_vault_key;\nCREATE UNIQUE INDEX IF NOT EXISTS mem_vault_registry_grantee_handle_uniq ON mem_vault_registry (grantee, handle);\n\n-- Account-level grant: grantee may act inside owner's FULL database (all current\n-- and future vaults) at the granted entitlement. Distinct from a single-vault\n-- share (which writes one mem_vault_registry row).\nCREATE TABLE IF NOT EXISTS mem_account_grants (\n id BIGSERIAL PRIMARY KEY,\n owner_identity TEXT NOT NULL,\n grantee TEXT NOT NULL,\n entitlement JSONB NOT NULL DEFAULT '{}'::jsonb,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (owner_identity, grantee)\n);\nCREATE INDEX IF NOT EXISTS mem_account_grants_grantee_idx ON mem_account_grants (grantee);\n\n-- Persistent per-identity active context (whose DB / which vault is the default\n-- target). Keyed by identity, NOT session, so a brand-new client instance\n-- inherits the last toggle instead of re-prompting. active_owner = identity (or\n-- NULL) means \"my own account\".\nCREATE TABLE IF NOT EXISTS mem_active_context (\n identity TEXT PRIMARY KEY,\n active_owner TEXT,\n active_vault TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE TABLE IF NOT EXISTS mem_approved_senders (\n id BIGSERIAL PRIMARY KEY,\n owner_identity TEXT NOT NULL,\n sender_identity TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (owner_identity, sender_identity)\n);\nCREATE INDEX IF NOT EXISTS mem_approved_senders_owner_idx ON mem_approved_senders (owner_identity);\n\nCREATE TABLE IF NOT EXISTS mem_settings (\n identity TEXT PRIMARY KEY,\n allow_unapproved_senders BOOLEAN NOT NULL DEFAULT FALSE,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS is_agent BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS chat_link_key_id TEXT;\nALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS schedule_link_key_id TEXT;\n\nCREATE TABLE IF NOT EXISTS mem_notes (\n id TEXT PRIMARY KEY,\n vault TEXT NOT NULL,\n path TEXT NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n kind TEXT NOT NULL DEFAULT 'note',\n source TEXT NOT NULL DEFAULT '',\n captured_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (vault, path)\n);\nCREATE INDEX IF NOT EXISTS mem_notes_vault_idx ON mem_notes (vault);\nCREATE INDEX IF NOT EXISTS mem_notes_kind_idx ON mem_notes (kind);\nCREATE INDEX IF NOT EXISTS mem_notes_captured_at_idx ON mem_notes (captured_at);\nALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS props JSONB NOT NULL DEFAULT '{}'::jsonb;\nALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS revision INTEGER NOT NULL DEFAULT 1;\nALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS updated_by TEXT;\n\n-- Entirely separate from mem_notes: never indexed, never searched, never shared, by construction\n-- (nothing else queries this table). Content is application-layer encrypted before it lands here.\nCREATE TABLE IF NOT EXISTS mem_secure_notes (\n id TEXT PRIMARY KEY,\n vault TEXT NOT NULL,\n path TEXT NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n content_enc TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_by TEXT,\n UNIQUE (vault, path)\n);\nCREATE INDEX IF NOT EXISTS mem_secure_notes_vault_idx ON mem_secure_notes (vault);\n\nCREATE TABLE IF NOT EXISTS mem_note_shares (\n share_id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL,\n owner_identity TEXT NOT NULL,\n src_vault TEXT NOT NULL,\n src_path TEXT NOT NULL,\n grantee TEXT NOT NULL,\n permissions JSONB NOT NULL DEFAULT '{}'::jsonb,\n status TEXT NOT NULL DEFAULT 'pending',\n bundle_root TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, grantee)\n);\nCREATE INDEX IF NOT EXISTS mem_note_shares_grantee_status_idx ON mem_note_shares (grantee, status);\nCREATE INDEX IF NOT EXISTS mem_note_shares_note_idx ON mem_note_shares (note_id);\n\nCREATE TABLE IF NOT EXISTS mem_channel_cursor (\n identity TEXT NOT NULL,\n vault TEXT NOT NULL,\n last_polled_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (identity, vault)\n);\n\nCREATE TABLE IF NOT EXISTS mem_message_reactions (\n id BIGSERIAL PRIMARY KEY,\n message_id TEXT NOT NULL,\n identity TEXT NOT NULL,\n emoji TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (message_id, identity, emoji)\n);\nCREATE INDEX IF NOT EXISTS mem_message_reactions_message_idx ON mem_message_reactions (message_id);\n\nCREATE TABLE IF NOT EXISTS mem_mentions (\n id BIGSERIAL PRIMARY KEY,\n message_id TEXT NOT NULL,\n owner_identity TEXT NOT NULL,\n vault TEXT NOT NULL,\n mentioned TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_mentions_mentioned_idx ON mem_mentions (mentioned, created_at DESC);\n\nCREATE TABLE IF NOT EXISTS mem_message_reads (\n message_id TEXT NOT NULL,\n identity TEXT NOT NULL,\n read_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (message_id, identity)\n);\n\nCREATE TABLE IF NOT EXISTS mem_note_presence (\n note_id TEXT NOT NULL,\n identity TEXT NOT NULL,\n heartbeat_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (note_id, identity)\n);\nCREATE INDEX IF NOT EXISTS mem_note_presence_note_idx ON mem_note_presence (note_id);\n\nCREATE TABLE IF NOT EXISTS mem_facts (\n id TEXT PRIMARY KEY,\n vault TEXT NOT NULL,\n subject TEXT NOT NULL,\n value TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT '',\n confidence REAL NOT NULL DEFAULT 0.5,\n status TEXT NOT NULL DEFAULT 'active',\n superseded_by TEXT,\n resolution TEXT,\n precedence TEXT,\n identity TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_facts_vault_subject_status_idx ON mem_facts (vault, subject, status);\nCREATE INDEX IF NOT EXISTS mem_facts_identity_idx ON mem_facts (identity);\nCREATE INDEX IF NOT EXISTS mem_facts_superseded_by_idx ON mem_facts (superseded_by);\n\nCREATE TABLE IF NOT EXISTS mem_usage_ledger (\n id BIGSERIAL PRIMARY KEY,\n identity TEXT NOT NULL,\n ts TIMESTAMPTZ NOT NULL DEFAULT now(),\n source TEXT NOT NULL,\n op TEXT NOT NULL DEFAULT '',\n tokens INTEGER NOT NULL DEFAULT 0,\n cost_usd NUMERIC NOT NULL DEFAULT 0,\n vault TEXT,\n period TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS mem_usage_ledger_identity_period_idx ON mem_usage_ledger (identity, period);\nCREATE INDEX IF NOT EXISTS mem_usage_ledger_period_idx ON mem_usage_ledger (period);\n\nCREATE TABLE IF NOT EXISTS mem_schedule_entitlements (\n identity TEXT PRIMARY KEY,\n enabled BOOLEAN NOT NULL DEFAULT FALSE,\n quota_per_period INTEGER NOT NULL DEFAULT 1000,\n used_this_period INTEGER NOT NULL DEFAULT 0,\n period_start DATE NOT NULL DEFAULT CURRENT_DATE,\n scraper_api_key_enc TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE TABLE IF NOT EXISTS mem_scheduled_actions (\n id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n description TEXT NOT NULL,\n vault TEXT NOT NULL,\n cadence TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n next_run_at TIMESTAMPTZ NOT NULL,\n last_run_at TIMESTAMPTZ,\n last_run_status TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_scheduled_actions_identity_idx ON mem_scheduled_actions (identity);\nCREATE INDEX IF NOT EXISTS mem_scheduled_actions_due_idx ON mem_scheduled_actions (status, next_run_at);\nALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS time_of_day TEXT;\nALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS timezone TEXT NOT NULL DEFAULT 'UTC';\nDO $$ BEGIN\n ALTER TABLE mem_scheduled_actions ADD CONSTRAINT mem_scheduled_actions_cadence_check CHECK (cadence IN ('once','daily','weekly','monthly'));\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\nDO $$ BEGIN\n ALTER TABLE mem_scheduled_actions ADD CONSTRAINT mem_scheduled_actions_status_check CHECK (status IN ('active','paused','deleted','completed'));\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\nALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS system TEXT;\nCREATE UNIQUE INDEX IF NOT EXISTS mem_scheduled_actions_system_uniq ON mem_scheduled_actions (identity, system) WHERE system IS NOT NULL;\n\nCREATE TABLE IF NOT EXISTS mem_props_snapshots (\n id BIGSERIAL PRIMARY KEY,\n vault TEXT NOT NULL,\n path TEXT NOT NULL,\n prev_props JSONB NOT NULL,\n run_id TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_props_snapshots_vault_path_idx ON mem_props_snapshots (vault, path, created_at DESC);\nCREATE INDEX IF NOT EXISTS mem_props_snapshots_created_at_idx ON mem_props_snapshots (created_at);\n\nCREATE TABLE IF NOT EXISTS mem_interlink_state (\n identity TEXT PRIMARY KEY,\n cursor JSONB,\n last_run_at TEXT,\n last_summary TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE TABLE IF NOT EXISTS mem_webhooks (\n id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n key_id TEXT NOT NULL,\n vault TEXT NOT NULL,\n label TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_webhooks_identity_idx ON mem_webhooks (identity);\n\nCREATE TABLE IF NOT EXISTS mem_video_runs (\n id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n vault TEXT NOT NULL,\n source_url TEXT NOT NULL,\n media_url TEXT,\n scraper_api_key TEXT,\n interval_s REAL NOT NULL,\n max_frames INTEGER NOT NULL,\n detail TEXT NOT NULL DEFAULT 'standard',\n duration_s REAL,\n frame_count INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'queued',\n error TEXT,\n transcript JSONB,\n metrics JSONB,\n lenses JSONB,\n qc JSONB,\n report_md TEXT,\n artifact_path TEXT,\n cost_usd REAL NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_video_runs_identity_idx ON mem_video_runs (identity);\n\nCREATE TABLE IF NOT EXISTS mem_video_frames (\n run_id TEXT NOT NULL REFERENCES mem_video_runs(id) ON DELETE CASCADE,\n idx INTEGER NOT NULL,\n t_sec REAL NOT NULL,\n img_b64 TEXT,\n observation JSONB,\n detail JSONB,\n status TEXT NOT NULL DEFAULT 'pending',\n PRIMARY KEY (run_id, idx)\n);\nCREATE INDEX IF NOT EXISTS mem_video_frames_run_idx ON mem_video_frames (run_id, idx);\nALTER TABLE mem_video_frames ADD COLUMN IF NOT EXISTS img_b64 TEXT;\n";
|
|
2
|
+
|
|
3
|
+
export { schemaSql };
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
const schemaSql = `
|
|
2
|
+
CREATE TABLE IF NOT EXISTS mem_keys (
|
|
3
|
+
key_id TEXT PRIMARY KEY,
|
|
4
|
+
secret_hash TEXT NOT NULL,
|
|
5
|
+
identity TEXT NOT NULL,
|
|
6
|
+
vaults JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
7
|
+
scope JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
8
|
+
plan TEXT NOT NULL DEFAULT 'free',
|
|
9
|
+
expires_at TIMESTAMPTZ,
|
|
10
|
+
revoked BOOLEAN NOT NULL DEFAULT FALSE,
|
|
11
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
12
|
+
last_used_at TIMESTAMPTZ,
|
|
13
|
+
usage_count INTEGER NOT NULL DEFAULT 0
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS mem_keys_secret_hash_idx ON mem_keys (secret_hash);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS mem_keys_identity_idx ON mem_keys (identity);
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS mem_provenance (
|
|
19
|
+
id BIGSERIAL PRIMARY KEY,
|
|
20
|
+
key_id TEXT,
|
|
21
|
+
identity TEXT NOT NULL,
|
|
22
|
+
session TEXT,
|
|
23
|
+
op TEXT NOT NULL,
|
|
24
|
+
target TEXT,
|
|
25
|
+
detail JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
26
|
+
ts TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
27
|
+
);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS mem_provenance_identity_idx ON mem_provenance (identity);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS mem_provenance_ts_idx ON mem_provenance (ts);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE IF NOT EXISTS mem_vault_registry (
|
|
32
|
+
id BIGSERIAL PRIMARY KEY,
|
|
33
|
+
grantee TEXT NOT NULL,
|
|
34
|
+
vault TEXT NOT NULL,
|
|
35
|
+
owner_identity TEXT NOT NULL,
|
|
36
|
+
entitlement JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
37
|
+
shared BOOLEAN NOT NULL DEFAULT FALSE,
|
|
38
|
+
precedence_default TEXT DEFAULT 'recency',
|
|
39
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
40
|
+
UNIQUE (grantee, vault)
|
|
41
|
+
);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS mem_vault_registry_grantee_idx ON mem_vault_registry (grantee);
|
|
43
|
+
ALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS precedence_default TEXT DEFAULT 'recency';
|
|
44
|
+
ALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS contract JSONB;
|
|
45
|
+
|
|
46
|
+
CREATE TABLE IF NOT EXISTS mem_sessions (
|
|
47
|
+
session_id TEXT PRIMARY KEY,
|
|
48
|
+
identity TEXT NOT NULL,
|
|
49
|
+
active_vault TEXT,
|
|
50
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
-- Owner-qualified addressing for shared vaults: a grantee addresses a vault by
|
|
54
|
+
-- its handle (own vaults = bare name, shared vaults = "owner/Name"). Re-key the
|
|
55
|
+
-- registry on (grantee, handle) so a shared vault can coexist with an own vault
|
|
56
|
+
-- of the same name without colliding.
|
|
57
|
+
ALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS handle TEXT;
|
|
58
|
+
UPDATE mem_vault_registry SET handle = vault WHERE handle IS NULL;
|
|
59
|
+
ALTER TABLE mem_vault_registry DROP CONSTRAINT IF EXISTS mem_vault_registry_grantee_vault_key;
|
|
60
|
+
CREATE UNIQUE INDEX IF NOT EXISTS mem_vault_registry_grantee_handle_uniq ON mem_vault_registry (grantee, handle);
|
|
61
|
+
|
|
62
|
+
-- Account-level grant: grantee may act inside owner's FULL database (all current
|
|
63
|
+
-- and future vaults) at the granted entitlement. Distinct from a single-vault
|
|
64
|
+
-- share (which writes one mem_vault_registry row).
|
|
65
|
+
CREATE TABLE IF NOT EXISTS mem_account_grants (
|
|
66
|
+
id BIGSERIAL PRIMARY KEY,
|
|
67
|
+
owner_identity TEXT NOT NULL,
|
|
68
|
+
grantee TEXT NOT NULL,
|
|
69
|
+
entitlement JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
70
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
71
|
+
UNIQUE (owner_identity, grantee)
|
|
72
|
+
);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS mem_account_grants_grantee_idx ON mem_account_grants (grantee);
|
|
74
|
+
|
|
75
|
+
-- Persistent per-identity active context (whose DB / which vault is the default
|
|
76
|
+
-- target). Keyed by identity, NOT session, so a brand-new client instance
|
|
77
|
+
-- inherits the last toggle instead of re-prompting. active_owner = identity (or
|
|
78
|
+
-- NULL) means "my own account".
|
|
79
|
+
CREATE TABLE IF NOT EXISTS mem_active_context (
|
|
80
|
+
identity TEXT PRIMARY KEY,
|
|
81
|
+
active_owner TEXT,
|
|
82
|
+
active_vault TEXT,
|
|
83
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
CREATE TABLE IF NOT EXISTS mem_approved_senders (
|
|
87
|
+
id BIGSERIAL PRIMARY KEY,
|
|
88
|
+
owner_identity TEXT NOT NULL,
|
|
89
|
+
sender_identity TEXT NOT NULL,
|
|
90
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
91
|
+
UNIQUE (owner_identity, sender_identity)
|
|
92
|
+
);
|
|
93
|
+
CREATE INDEX IF NOT EXISTS mem_approved_senders_owner_idx ON mem_approved_senders (owner_identity);
|
|
94
|
+
|
|
95
|
+
CREATE TABLE IF NOT EXISTS mem_settings (
|
|
96
|
+
identity TEXT PRIMARY KEY,
|
|
97
|
+
allow_unapproved_senders BOOLEAN NOT NULL DEFAULT FALSE,
|
|
98
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
99
|
+
);
|
|
100
|
+
ALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS is_agent BOOLEAN NOT NULL DEFAULT FALSE;
|
|
101
|
+
ALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS chat_link_key_id TEXT;
|
|
102
|
+
ALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS schedule_link_key_id TEXT;
|
|
103
|
+
|
|
104
|
+
CREATE TABLE IF NOT EXISTS mem_notes (
|
|
105
|
+
id TEXT PRIMARY KEY,
|
|
106
|
+
vault TEXT NOT NULL,
|
|
107
|
+
path TEXT NOT NULL,
|
|
108
|
+
title TEXT NOT NULL DEFAULT '',
|
|
109
|
+
content TEXT NOT NULL DEFAULT '',
|
|
110
|
+
kind TEXT NOT NULL DEFAULT 'note',
|
|
111
|
+
source TEXT NOT NULL DEFAULT '',
|
|
112
|
+
captured_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
113
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
114
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
115
|
+
UNIQUE (vault, path)
|
|
116
|
+
);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS mem_notes_vault_idx ON mem_notes (vault);
|
|
118
|
+
CREATE INDEX IF NOT EXISTS mem_notes_kind_idx ON mem_notes (kind);
|
|
119
|
+
CREATE INDEX IF NOT EXISTS mem_notes_captured_at_idx ON mem_notes (captured_at);
|
|
120
|
+
ALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS props JSONB NOT NULL DEFAULT '{}'::jsonb;
|
|
121
|
+
ALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS revision INTEGER NOT NULL DEFAULT 1;
|
|
122
|
+
ALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS updated_by TEXT;
|
|
123
|
+
|
|
124
|
+
-- Entirely separate from mem_notes: never indexed, never searched, never shared, by construction
|
|
125
|
+
-- (nothing else queries this table). Content is application-layer encrypted before it lands here.
|
|
126
|
+
CREATE TABLE IF NOT EXISTS mem_secure_notes (
|
|
127
|
+
id TEXT PRIMARY KEY,
|
|
128
|
+
vault TEXT NOT NULL,
|
|
129
|
+
path TEXT NOT NULL,
|
|
130
|
+
title TEXT NOT NULL DEFAULT '',
|
|
131
|
+
content_enc TEXT NOT NULL,
|
|
132
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
133
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
134
|
+
updated_by TEXT,
|
|
135
|
+
UNIQUE (vault, path)
|
|
136
|
+
);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS mem_secure_notes_vault_idx ON mem_secure_notes (vault);
|
|
138
|
+
|
|
139
|
+
CREATE TABLE IF NOT EXISTS mem_note_shares (
|
|
140
|
+
share_id TEXT PRIMARY KEY,
|
|
141
|
+
note_id TEXT NOT NULL,
|
|
142
|
+
owner_identity TEXT NOT NULL,
|
|
143
|
+
src_vault TEXT NOT NULL,
|
|
144
|
+
src_path TEXT NOT NULL,
|
|
145
|
+
grantee TEXT NOT NULL,
|
|
146
|
+
permissions JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
147
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
148
|
+
bundle_root TEXT,
|
|
149
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
150
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
151
|
+
UNIQUE (note_id, grantee)
|
|
152
|
+
);
|
|
153
|
+
CREATE INDEX IF NOT EXISTS mem_note_shares_grantee_status_idx ON mem_note_shares (grantee, status);
|
|
154
|
+
CREATE INDEX IF NOT EXISTS mem_note_shares_note_idx ON mem_note_shares (note_id);
|
|
155
|
+
|
|
156
|
+
CREATE TABLE IF NOT EXISTS mem_channel_cursor (
|
|
157
|
+
identity TEXT NOT NULL,
|
|
158
|
+
vault TEXT NOT NULL,
|
|
159
|
+
last_polled_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
160
|
+
PRIMARY KEY (identity, vault)
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
CREATE TABLE IF NOT EXISTS mem_message_reactions (
|
|
164
|
+
id BIGSERIAL PRIMARY KEY,
|
|
165
|
+
message_id TEXT NOT NULL,
|
|
166
|
+
identity TEXT NOT NULL,
|
|
167
|
+
emoji TEXT NOT NULL,
|
|
168
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
169
|
+
UNIQUE (message_id, identity, emoji)
|
|
170
|
+
);
|
|
171
|
+
CREATE INDEX IF NOT EXISTS mem_message_reactions_message_idx ON mem_message_reactions (message_id);
|
|
172
|
+
|
|
173
|
+
CREATE TABLE IF NOT EXISTS mem_mentions (
|
|
174
|
+
id BIGSERIAL PRIMARY KEY,
|
|
175
|
+
message_id TEXT NOT NULL,
|
|
176
|
+
owner_identity TEXT NOT NULL,
|
|
177
|
+
vault TEXT NOT NULL,
|
|
178
|
+
mentioned TEXT NOT NULL,
|
|
179
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
180
|
+
);
|
|
181
|
+
CREATE INDEX IF NOT EXISTS mem_mentions_mentioned_idx ON mem_mentions (mentioned, created_at DESC);
|
|
182
|
+
|
|
183
|
+
CREATE TABLE IF NOT EXISTS mem_message_reads (
|
|
184
|
+
message_id TEXT NOT NULL,
|
|
185
|
+
identity TEXT NOT NULL,
|
|
186
|
+
read_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
187
|
+
PRIMARY KEY (message_id, identity)
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
CREATE TABLE IF NOT EXISTS mem_note_presence (
|
|
191
|
+
note_id TEXT NOT NULL,
|
|
192
|
+
identity TEXT NOT NULL,
|
|
193
|
+
heartbeat_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
194
|
+
PRIMARY KEY (note_id, identity)
|
|
195
|
+
);
|
|
196
|
+
CREATE INDEX IF NOT EXISTS mem_note_presence_note_idx ON mem_note_presence (note_id);
|
|
197
|
+
|
|
198
|
+
CREATE TABLE IF NOT EXISTS mem_facts (
|
|
199
|
+
id TEXT PRIMARY KEY,
|
|
200
|
+
vault TEXT NOT NULL,
|
|
201
|
+
subject TEXT NOT NULL,
|
|
202
|
+
value TEXT NOT NULL,
|
|
203
|
+
source TEXT NOT NULL DEFAULT '',
|
|
204
|
+
confidence REAL NOT NULL DEFAULT 0.5,
|
|
205
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
206
|
+
superseded_by TEXT,
|
|
207
|
+
resolution TEXT,
|
|
208
|
+
precedence TEXT,
|
|
209
|
+
identity TEXT NOT NULL,
|
|
210
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
211
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
212
|
+
);
|
|
213
|
+
CREATE INDEX IF NOT EXISTS mem_facts_vault_subject_status_idx ON mem_facts (vault, subject, status);
|
|
214
|
+
CREATE INDEX IF NOT EXISTS mem_facts_identity_idx ON mem_facts (identity);
|
|
215
|
+
CREATE INDEX IF NOT EXISTS mem_facts_superseded_by_idx ON mem_facts (superseded_by);
|
|
216
|
+
|
|
217
|
+
CREATE TABLE IF NOT EXISTS mem_usage_ledger (
|
|
218
|
+
id BIGSERIAL PRIMARY KEY,
|
|
219
|
+
identity TEXT NOT NULL,
|
|
220
|
+
ts TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
221
|
+
source TEXT NOT NULL,
|
|
222
|
+
op TEXT NOT NULL DEFAULT '',
|
|
223
|
+
tokens INTEGER NOT NULL DEFAULT 0,
|
|
224
|
+
cost_usd NUMERIC NOT NULL DEFAULT 0,
|
|
225
|
+
vault TEXT,
|
|
226
|
+
period TEXT NOT NULL
|
|
227
|
+
);
|
|
228
|
+
CREATE INDEX IF NOT EXISTS mem_usage_ledger_identity_period_idx ON mem_usage_ledger (identity, period);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS mem_usage_ledger_period_idx ON mem_usage_ledger (period);
|
|
230
|
+
|
|
231
|
+
CREATE TABLE IF NOT EXISTS mem_schedule_entitlements (
|
|
232
|
+
identity TEXT PRIMARY KEY,
|
|
233
|
+
enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
|
234
|
+
quota_per_period INTEGER NOT NULL DEFAULT 1000,
|
|
235
|
+
used_this_period INTEGER NOT NULL DEFAULT 0,
|
|
236
|
+
period_start DATE NOT NULL DEFAULT CURRENT_DATE,
|
|
237
|
+
scraper_api_key_enc TEXT,
|
|
238
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
CREATE TABLE IF NOT EXISTS mem_scheduled_actions (
|
|
242
|
+
id TEXT PRIMARY KEY,
|
|
243
|
+
identity TEXT NOT NULL,
|
|
244
|
+
description TEXT NOT NULL,
|
|
245
|
+
vault TEXT NOT NULL,
|
|
246
|
+
cadence TEXT NOT NULL,
|
|
247
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
248
|
+
next_run_at TIMESTAMPTZ NOT NULL,
|
|
249
|
+
last_run_at TIMESTAMPTZ,
|
|
250
|
+
last_run_status TEXT,
|
|
251
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
252
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
253
|
+
);
|
|
254
|
+
CREATE INDEX IF NOT EXISTS mem_scheduled_actions_identity_idx ON mem_scheduled_actions (identity);
|
|
255
|
+
CREATE INDEX IF NOT EXISTS mem_scheduled_actions_due_idx ON mem_scheduled_actions (status, next_run_at);
|
|
256
|
+
ALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS time_of_day TEXT;
|
|
257
|
+
ALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS timezone TEXT NOT NULL DEFAULT 'UTC';
|
|
258
|
+
DO $$ BEGIN
|
|
259
|
+
ALTER TABLE mem_scheduled_actions ADD CONSTRAINT mem_scheduled_actions_cadence_check CHECK (cadence IN ('once','daily','weekly','monthly'));
|
|
260
|
+
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
261
|
+
END $$;
|
|
262
|
+
DO $$ BEGIN
|
|
263
|
+
ALTER TABLE mem_scheduled_actions ADD CONSTRAINT mem_scheduled_actions_status_check CHECK (status IN ('active','paused','deleted','completed'));
|
|
264
|
+
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
265
|
+
END $$;
|
|
266
|
+
ALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS system TEXT;
|
|
267
|
+
CREATE UNIQUE INDEX IF NOT EXISTS mem_scheduled_actions_system_uniq ON mem_scheduled_actions (identity, system) WHERE system IS NOT NULL;
|
|
268
|
+
|
|
269
|
+
CREATE TABLE IF NOT EXISTS mem_props_snapshots (
|
|
270
|
+
id BIGSERIAL PRIMARY KEY,
|
|
271
|
+
vault TEXT NOT NULL,
|
|
272
|
+
path TEXT NOT NULL,
|
|
273
|
+
prev_props JSONB NOT NULL,
|
|
274
|
+
run_id TEXT,
|
|
275
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
276
|
+
);
|
|
277
|
+
CREATE INDEX IF NOT EXISTS mem_props_snapshots_vault_path_idx ON mem_props_snapshots (vault, path, created_at DESC);
|
|
278
|
+
CREATE INDEX IF NOT EXISTS mem_props_snapshots_created_at_idx ON mem_props_snapshots (created_at);
|
|
279
|
+
|
|
280
|
+
CREATE TABLE IF NOT EXISTS mem_interlink_state (
|
|
281
|
+
identity TEXT PRIMARY KEY,
|
|
282
|
+
cursor JSONB,
|
|
283
|
+
last_run_at TEXT,
|
|
284
|
+
last_summary TEXT,
|
|
285
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
CREATE TABLE IF NOT EXISTS mem_webhooks (
|
|
289
|
+
id TEXT PRIMARY KEY,
|
|
290
|
+
identity TEXT NOT NULL,
|
|
291
|
+
key_id TEXT NOT NULL,
|
|
292
|
+
vault TEXT NOT NULL,
|
|
293
|
+
label TEXT,
|
|
294
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
295
|
+
);
|
|
296
|
+
CREATE INDEX IF NOT EXISTS mem_webhooks_identity_idx ON mem_webhooks (identity);
|
|
297
|
+
|
|
298
|
+
CREATE TABLE IF NOT EXISTS mem_video_runs (
|
|
299
|
+
id TEXT PRIMARY KEY,
|
|
300
|
+
identity TEXT NOT NULL,
|
|
301
|
+
vault TEXT NOT NULL,
|
|
302
|
+
source_url TEXT NOT NULL,
|
|
303
|
+
media_url TEXT,
|
|
304
|
+
scraper_api_key TEXT,
|
|
305
|
+
interval_s REAL NOT NULL,
|
|
306
|
+
max_frames INTEGER NOT NULL,
|
|
307
|
+
detail TEXT NOT NULL DEFAULT 'standard',
|
|
308
|
+
duration_s REAL,
|
|
309
|
+
frame_count INTEGER NOT NULL DEFAULT 0,
|
|
310
|
+
status TEXT NOT NULL DEFAULT 'queued',
|
|
311
|
+
error TEXT,
|
|
312
|
+
transcript JSONB,
|
|
313
|
+
metrics JSONB,
|
|
314
|
+
lenses JSONB,
|
|
315
|
+
qc JSONB,
|
|
316
|
+
report_md TEXT,
|
|
317
|
+
artifact_path TEXT,
|
|
318
|
+
cost_usd REAL NOT NULL DEFAULT 0,
|
|
319
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
320
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
321
|
+
);
|
|
322
|
+
CREATE INDEX IF NOT EXISTS mem_video_runs_identity_idx ON mem_video_runs (identity);
|
|
323
|
+
|
|
324
|
+
CREATE TABLE IF NOT EXISTS mem_video_frames (
|
|
325
|
+
run_id TEXT NOT NULL REFERENCES mem_video_runs(id) ON DELETE CASCADE,
|
|
326
|
+
idx INTEGER NOT NULL,
|
|
327
|
+
t_sec REAL NOT NULL,
|
|
328
|
+
img_b64 TEXT,
|
|
329
|
+
observation JSONB,
|
|
330
|
+
detail JSONB,
|
|
331
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
332
|
+
PRIMARY KEY (run_id, idx)
|
|
333
|
+
);
|
|
334
|
+
CREATE INDEX IF NOT EXISTS mem_video_frames_run_idx ON mem_video_frames (run_id, idx);
|
|
335
|
+
ALTER TABLE mem_video_frames ADD COLUMN IF NOT EXISTS img_b64 TEXT;
|
|
336
|
+
`;
|
|
337
|
+
export {
|
|
338
|
+
schemaSql
|
|
339
|
+
};
|
|
340
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/schema.ts"],"sourcesContent":["export const schemaSql = `\nCREATE TABLE IF NOT EXISTS mem_keys (\n key_id TEXT PRIMARY KEY,\n secret_hash TEXT NOT NULL,\n identity TEXT NOT NULL,\n vaults JSONB NOT NULL DEFAULT '[]'::jsonb,\n scope JSONB NOT NULL DEFAULT '{}'::jsonb,\n plan TEXT NOT NULL DEFAULT 'free',\n expires_at TIMESTAMPTZ,\n revoked BOOLEAN NOT NULL DEFAULT FALSE,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n last_used_at TIMESTAMPTZ,\n usage_count INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS mem_keys_secret_hash_idx ON mem_keys (secret_hash);\nCREATE INDEX IF NOT EXISTS mem_keys_identity_idx ON mem_keys (identity);\n\nCREATE TABLE IF NOT EXISTS mem_provenance (\n id BIGSERIAL PRIMARY KEY,\n key_id TEXT,\n identity TEXT NOT NULL,\n session TEXT,\n op TEXT NOT NULL,\n target TEXT,\n detail JSONB NOT NULL DEFAULT '{}'::jsonb,\n ts TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_provenance_identity_idx ON mem_provenance (identity);\nCREATE INDEX IF NOT EXISTS mem_provenance_ts_idx ON mem_provenance (ts);\n\nCREATE TABLE IF NOT EXISTS mem_vault_registry (\n id BIGSERIAL PRIMARY KEY,\n grantee TEXT NOT NULL,\n vault TEXT NOT NULL,\n owner_identity TEXT NOT NULL,\n entitlement JSONB NOT NULL DEFAULT '{}'::jsonb,\n shared BOOLEAN NOT NULL DEFAULT FALSE,\n precedence_default TEXT DEFAULT 'recency',\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (grantee, vault)\n);\nCREATE INDEX IF NOT EXISTS mem_vault_registry_grantee_idx ON mem_vault_registry (grantee);\nALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS precedence_default TEXT DEFAULT 'recency';\nALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS contract JSONB;\n\nCREATE TABLE IF NOT EXISTS mem_sessions (\n session_id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n active_vault TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\n-- Owner-qualified addressing for shared vaults: a grantee addresses a vault by\n-- its handle (own vaults = bare name, shared vaults = \"owner/Name\"). Re-key the\n-- registry on (grantee, handle) so a shared vault can coexist with an own vault\n-- of the same name without colliding.\nALTER TABLE mem_vault_registry ADD COLUMN IF NOT EXISTS handle TEXT;\nUPDATE mem_vault_registry SET handle = vault WHERE handle IS NULL;\nALTER TABLE mem_vault_registry DROP CONSTRAINT IF EXISTS mem_vault_registry_grantee_vault_key;\nCREATE UNIQUE INDEX IF NOT EXISTS mem_vault_registry_grantee_handle_uniq ON mem_vault_registry (grantee, handle);\n\n-- Account-level grant: grantee may act inside owner's FULL database (all current\n-- and future vaults) at the granted entitlement. Distinct from a single-vault\n-- share (which writes one mem_vault_registry row).\nCREATE TABLE IF NOT EXISTS mem_account_grants (\n id BIGSERIAL PRIMARY KEY,\n owner_identity TEXT NOT NULL,\n grantee TEXT NOT NULL,\n entitlement JSONB NOT NULL DEFAULT '{}'::jsonb,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (owner_identity, grantee)\n);\nCREATE INDEX IF NOT EXISTS mem_account_grants_grantee_idx ON mem_account_grants (grantee);\n\n-- Persistent per-identity active context (whose DB / which vault is the default\n-- target). Keyed by identity, NOT session, so a brand-new client instance\n-- inherits the last toggle instead of re-prompting. active_owner = identity (or\n-- NULL) means \"my own account\".\nCREATE TABLE IF NOT EXISTS mem_active_context (\n identity TEXT PRIMARY KEY,\n active_owner TEXT,\n active_vault TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE TABLE IF NOT EXISTS mem_approved_senders (\n id BIGSERIAL PRIMARY KEY,\n owner_identity TEXT NOT NULL,\n sender_identity TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (owner_identity, sender_identity)\n);\nCREATE INDEX IF NOT EXISTS mem_approved_senders_owner_idx ON mem_approved_senders (owner_identity);\n\nCREATE TABLE IF NOT EXISTS mem_settings (\n identity TEXT PRIMARY KEY,\n allow_unapproved_senders BOOLEAN NOT NULL DEFAULT FALSE,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS is_agent BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS chat_link_key_id TEXT;\nALTER TABLE mem_settings ADD COLUMN IF NOT EXISTS schedule_link_key_id TEXT;\n\nCREATE TABLE IF NOT EXISTS mem_notes (\n id TEXT PRIMARY KEY,\n vault TEXT NOT NULL,\n path TEXT NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n kind TEXT NOT NULL DEFAULT 'note',\n source TEXT NOT NULL DEFAULT '',\n captured_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (vault, path)\n);\nCREATE INDEX IF NOT EXISTS mem_notes_vault_idx ON mem_notes (vault);\nCREATE INDEX IF NOT EXISTS mem_notes_kind_idx ON mem_notes (kind);\nCREATE INDEX IF NOT EXISTS mem_notes_captured_at_idx ON mem_notes (captured_at);\nALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS props JSONB NOT NULL DEFAULT '{}'::jsonb;\nALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS revision INTEGER NOT NULL DEFAULT 1;\nALTER TABLE mem_notes ADD COLUMN IF NOT EXISTS updated_by TEXT;\n\n-- Entirely separate from mem_notes: never indexed, never searched, never shared, by construction\n-- (nothing else queries this table). Content is application-layer encrypted before it lands here.\nCREATE TABLE IF NOT EXISTS mem_secure_notes (\n id TEXT PRIMARY KEY,\n vault TEXT NOT NULL,\n path TEXT NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n content_enc TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_by TEXT,\n UNIQUE (vault, path)\n);\nCREATE INDEX IF NOT EXISTS mem_secure_notes_vault_idx ON mem_secure_notes (vault);\n\nCREATE TABLE IF NOT EXISTS mem_note_shares (\n share_id TEXT PRIMARY KEY,\n note_id TEXT NOT NULL,\n owner_identity TEXT NOT NULL,\n src_vault TEXT NOT NULL,\n src_path TEXT NOT NULL,\n grantee TEXT NOT NULL,\n permissions JSONB NOT NULL DEFAULT '{}'::jsonb,\n status TEXT NOT NULL DEFAULT 'pending',\n bundle_root TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (note_id, grantee)\n);\nCREATE INDEX IF NOT EXISTS mem_note_shares_grantee_status_idx ON mem_note_shares (grantee, status);\nCREATE INDEX IF NOT EXISTS mem_note_shares_note_idx ON mem_note_shares (note_id);\n\nCREATE TABLE IF NOT EXISTS mem_channel_cursor (\n identity TEXT NOT NULL,\n vault TEXT NOT NULL,\n last_polled_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (identity, vault)\n);\n\nCREATE TABLE IF NOT EXISTS mem_message_reactions (\n id BIGSERIAL PRIMARY KEY,\n message_id TEXT NOT NULL,\n identity TEXT NOT NULL,\n emoji TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n UNIQUE (message_id, identity, emoji)\n);\nCREATE INDEX IF NOT EXISTS mem_message_reactions_message_idx ON mem_message_reactions (message_id);\n\nCREATE TABLE IF NOT EXISTS mem_mentions (\n id BIGSERIAL PRIMARY KEY,\n message_id TEXT NOT NULL,\n owner_identity TEXT NOT NULL,\n vault TEXT NOT NULL,\n mentioned TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_mentions_mentioned_idx ON mem_mentions (mentioned, created_at DESC);\n\nCREATE TABLE IF NOT EXISTS mem_message_reads (\n message_id TEXT NOT NULL,\n identity TEXT NOT NULL,\n read_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (message_id, identity)\n);\n\nCREATE TABLE IF NOT EXISTS mem_note_presence (\n note_id TEXT NOT NULL,\n identity TEXT NOT NULL,\n heartbeat_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n PRIMARY KEY (note_id, identity)\n);\nCREATE INDEX IF NOT EXISTS mem_note_presence_note_idx ON mem_note_presence (note_id);\n\nCREATE TABLE IF NOT EXISTS mem_facts (\n id TEXT PRIMARY KEY,\n vault TEXT NOT NULL,\n subject TEXT NOT NULL,\n value TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT '',\n confidence REAL NOT NULL DEFAULT 0.5,\n status TEXT NOT NULL DEFAULT 'active',\n superseded_by TEXT,\n resolution TEXT,\n precedence TEXT,\n identity TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_facts_vault_subject_status_idx ON mem_facts (vault, subject, status);\nCREATE INDEX IF NOT EXISTS mem_facts_identity_idx ON mem_facts (identity);\nCREATE INDEX IF NOT EXISTS mem_facts_superseded_by_idx ON mem_facts (superseded_by);\n\nCREATE TABLE IF NOT EXISTS mem_usage_ledger (\n id BIGSERIAL PRIMARY KEY,\n identity TEXT NOT NULL,\n ts TIMESTAMPTZ NOT NULL DEFAULT now(),\n source TEXT NOT NULL,\n op TEXT NOT NULL DEFAULT '',\n tokens INTEGER NOT NULL DEFAULT 0,\n cost_usd NUMERIC NOT NULL DEFAULT 0,\n vault TEXT,\n period TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS mem_usage_ledger_identity_period_idx ON mem_usage_ledger (identity, period);\nCREATE INDEX IF NOT EXISTS mem_usage_ledger_period_idx ON mem_usage_ledger (period);\n\nCREATE TABLE IF NOT EXISTS mem_schedule_entitlements (\n identity TEXT PRIMARY KEY,\n enabled BOOLEAN NOT NULL DEFAULT FALSE,\n quota_per_period INTEGER NOT NULL DEFAULT 1000,\n used_this_period INTEGER NOT NULL DEFAULT 0,\n period_start DATE NOT NULL DEFAULT CURRENT_DATE,\n scraper_api_key_enc TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE TABLE IF NOT EXISTS mem_scheduled_actions (\n id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n description TEXT NOT NULL,\n vault TEXT NOT NULL,\n cadence TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n next_run_at TIMESTAMPTZ NOT NULL,\n last_run_at TIMESTAMPTZ,\n last_run_status TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_scheduled_actions_identity_idx ON mem_scheduled_actions (identity);\nCREATE INDEX IF NOT EXISTS mem_scheduled_actions_due_idx ON mem_scheduled_actions (status, next_run_at);\nALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS time_of_day TEXT;\nALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS timezone TEXT NOT NULL DEFAULT 'UTC';\nDO $$ BEGIN\n ALTER TABLE mem_scheduled_actions ADD CONSTRAINT mem_scheduled_actions_cadence_check CHECK (cadence IN ('once','daily','weekly','monthly'));\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\nDO $$ BEGIN\n ALTER TABLE mem_scheduled_actions ADD CONSTRAINT mem_scheduled_actions_status_check CHECK (status IN ('active','paused','deleted','completed'));\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\nALTER TABLE mem_scheduled_actions ADD COLUMN IF NOT EXISTS system TEXT;\nCREATE UNIQUE INDEX IF NOT EXISTS mem_scheduled_actions_system_uniq ON mem_scheduled_actions (identity, system) WHERE system IS NOT NULL;\n\nCREATE TABLE IF NOT EXISTS mem_props_snapshots (\n id BIGSERIAL PRIMARY KEY,\n vault TEXT NOT NULL,\n path TEXT NOT NULL,\n prev_props JSONB NOT NULL,\n run_id TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_props_snapshots_vault_path_idx ON mem_props_snapshots (vault, path, created_at DESC);\nCREATE INDEX IF NOT EXISTS mem_props_snapshots_created_at_idx ON mem_props_snapshots (created_at);\n\nCREATE TABLE IF NOT EXISTS mem_interlink_state (\n identity TEXT PRIMARY KEY,\n cursor JSONB,\n last_run_at TEXT,\n last_summary TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\n\nCREATE TABLE IF NOT EXISTS mem_webhooks (\n id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n key_id TEXT NOT NULL,\n vault TEXT NOT NULL,\n label TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_webhooks_identity_idx ON mem_webhooks (identity);\n\nCREATE TABLE IF NOT EXISTS mem_video_runs (\n id TEXT PRIMARY KEY,\n identity TEXT NOT NULL,\n vault TEXT NOT NULL,\n source_url TEXT NOT NULL,\n media_url TEXT,\n scraper_api_key TEXT,\n interval_s REAL NOT NULL,\n max_frames INTEGER NOT NULL,\n detail TEXT NOT NULL DEFAULT 'standard',\n duration_s REAL,\n frame_count INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'queued',\n error TEXT,\n transcript JSONB,\n metrics JSONB,\n lenses JSONB,\n qc JSONB,\n report_md TEXT,\n artifact_path TEXT,\n cost_usd REAL NOT NULL DEFAULT 0,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n);\nCREATE INDEX IF NOT EXISTS mem_video_runs_identity_idx ON mem_video_runs (identity);\n\nCREATE TABLE IF NOT EXISTS mem_video_frames (\n run_id TEXT NOT NULL REFERENCES mem_video_runs(id) ON DELETE CASCADE,\n idx INTEGER NOT NULL,\n t_sec REAL NOT NULL,\n img_b64 TEXT,\n observation JSONB,\n detail JSONB,\n status TEXT NOT NULL DEFAULT 'pending',\n PRIMARY KEY (run_id, idx)\n);\nCREATE INDEX IF NOT EXISTS mem_video_frames_run_idx ON mem_video_frames (run_id, idx);\nALTER TABLE mem_video_frames ADD COLUMN IF NOT EXISTS img_b64 TEXT;\n`\n"],"mappings":"AAAO,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface SecureNoteRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
vault: string;
|
|
4
|
+
path: string;
|
|
5
|
+
title: string;
|
|
6
|
+
content: string;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
updatedAt: string;
|
|
9
|
+
updatedBy: string | null;
|
|
10
|
+
}
|
|
11
|
+
declare function putSecureNote(args: {
|
|
12
|
+
vault: string;
|
|
13
|
+
path: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
content: string;
|
|
16
|
+
updatedBy?: string;
|
|
17
|
+
}): Promise<SecureNoteRecord>;
|
|
18
|
+
declare function getSecureNote(vault: string, path: string): Promise<SecureNoteRecord | null>;
|
|
19
|
+
declare function listSecureNotes(vault: string): Promise<Array<{
|
|
20
|
+
path: string;
|
|
21
|
+
title: string;
|
|
22
|
+
updatedAt: string;
|
|
23
|
+
}>>;
|
|
24
|
+
declare function deleteSecureNote(vault: string, path: string): Promise<boolean>;
|
|
25
|
+
|
|
26
|
+
export { type SecureNoteRecord, deleteSecureNote, getSecureNote, listSecureNotes, putSecureNote };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ensureSchema, query } from "./pool";
|
|
2
|
+
import { encryptSecret, decryptSecret } from "../lib/secret-crypto";
|
|
3
|
+
const COLUMNS = "id, vault, path, title, content_enc, created_at, updated_at, updated_by";
|
|
4
|
+
function secureNoteId(vault, path) {
|
|
5
|
+
return `secure::${vault}::${path}`;
|
|
6
|
+
}
|
|
7
|
+
function mapRow(r) {
|
|
8
|
+
return {
|
|
9
|
+
id: r.id,
|
|
10
|
+
vault: r.vault,
|
|
11
|
+
path: r.path,
|
|
12
|
+
title: r.title,
|
|
13
|
+
content: decryptSecret(r.content_enc),
|
|
14
|
+
createdAt: r.created_at,
|
|
15
|
+
updatedAt: r.updated_at,
|
|
16
|
+
updatedBy: r.updated_by
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async function putSecureNote(args) {
|
|
20
|
+
await ensureSchema();
|
|
21
|
+
const id = secureNoteId(args.vault, args.path);
|
|
22
|
+
const res = await query(
|
|
23
|
+
`INSERT INTO mem_secure_notes (id, vault, path, title, content_enc, updated_at, updated_by)
|
|
24
|
+
VALUES ($1, $2, $3, $4, $5, now(), $6)
|
|
25
|
+
ON CONFLICT (vault, path) DO UPDATE SET
|
|
26
|
+
title = EXCLUDED.title, content_enc = EXCLUDED.content_enc, updated_at = now(), updated_by = EXCLUDED.updated_by
|
|
27
|
+
RETURNING ${COLUMNS}`,
|
|
28
|
+
[id, args.vault, args.path, args.title ?? args.path, encryptSecret(args.content), args.updatedBy ?? null]
|
|
29
|
+
);
|
|
30
|
+
return mapRow(res.rows[0]);
|
|
31
|
+
}
|
|
32
|
+
async function getSecureNote(vault, path) {
|
|
33
|
+
await ensureSchema();
|
|
34
|
+
const res = await query(
|
|
35
|
+
`SELECT ${COLUMNS} FROM mem_secure_notes WHERE vault = $1 AND path = $2 LIMIT 1`,
|
|
36
|
+
[vault, path]
|
|
37
|
+
);
|
|
38
|
+
return res.rows[0] ? mapRow(res.rows[0]) : null;
|
|
39
|
+
}
|
|
40
|
+
async function listSecureNotes(vault) {
|
|
41
|
+
await ensureSchema();
|
|
42
|
+
const res = await query(
|
|
43
|
+
`SELECT path, title, updated_at FROM mem_secure_notes WHERE vault = $1 ORDER BY updated_at DESC`,
|
|
44
|
+
[vault]
|
|
45
|
+
);
|
|
46
|
+
return res.rows.map((r) => ({ path: r.path, title: r.title, updatedAt: r.updated_at }));
|
|
47
|
+
}
|
|
48
|
+
async function deleteSecureNote(vault, path) {
|
|
49
|
+
await ensureSchema();
|
|
50
|
+
const res = await query(`DELETE FROM mem_secure_notes WHERE vault = $1 AND path = $2`, [vault, path]);
|
|
51
|
+
return (res.rowCount ?? 0) > 0;
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
deleteSecureNote,
|
|
55
|
+
getSecureNote,
|
|
56
|
+
listSecureNotes,
|
|
57
|
+
putSecureNote
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=secure-notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/secure-notes.ts"],"sourcesContent":["import { ensureSchema, query } from './pool'\nimport { encryptSecret, decryptSecret } from '../lib/secret-crypto'\n\nexport interface SecureNoteRecord {\n id: string\n vault: string\n path: string\n title: string\n content: string\n createdAt: string\n updatedAt: string\n updatedBy: string | null\n}\n\ninterface RawSecureNoteRow {\n id: string\n vault: string\n path: string\n title: string\n content_enc: string\n created_at: string\n updated_at: string\n updated_by: string | null\n}\n\nconst COLUMNS = 'id, vault, path, title, content_enc, created_at, updated_at, updated_by'\n\nfunction secureNoteId(vault: string, path: string): string {\n return `secure::${vault}::${path}`\n}\n\nfunction mapRow(r: RawSecureNoteRow): SecureNoteRecord {\n return {\n id: r.id,\n vault: r.vault,\n path: r.path,\n title: r.title,\n content: decryptSecret(r.content_enc),\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n updatedBy: r.updated_by,\n }\n}\n\nexport async function putSecureNote(args: { vault: string; path: string; title?: string; content: string; updatedBy?: string }): Promise<SecureNoteRecord> {\n await ensureSchema()\n const id = secureNoteId(args.vault, args.path)\n const res = await query<RawSecureNoteRow>(\n `INSERT INTO mem_secure_notes (id, vault, path, title, content_enc, updated_at, updated_by)\n VALUES ($1, $2, $3, $4, $5, now(), $6)\n ON CONFLICT (vault, path) DO UPDATE SET\n title = EXCLUDED.title, content_enc = EXCLUDED.content_enc, updated_at = now(), updated_by = EXCLUDED.updated_by\n RETURNING ${COLUMNS}`,\n [id, args.vault, args.path, args.title ?? args.path, encryptSecret(args.content), args.updatedBy ?? null],\n )\n return mapRow(res.rows[0])\n}\n\nexport async function getSecureNote(vault: string, path: string): Promise<SecureNoteRecord | null> {\n await ensureSchema()\n const res = await query<RawSecureNoteRow>(\n `SELECT ${COLUMNS} FROM mem_secure_notes WHERE vault = $1 AND path = $2 LIMIT 1`,\n [vault, path],\n )\n return res.rows[0] ? mapRow(res.rows[0]) : null\n}\n\nexport async function listSecureNotes(vault: string): Promise<Array<{ path: string; title: string; updatedAt: string }>> {\n await ensureSchema()\n const res = await query<{ path: string; title: string; updated_at: string }>(\n `SELECT path, title, updated_at FROM mem_secure_notes WHERE vault = $1 ORDER BY updated_at DESC`,\n [vault],\n )\n return res.rows.map(r => ({ path: r.path, title: r.title, updatedAt: r.updated_at }))\n}\n\nexport async function deleteSecureNote(vault: string, path: string): Promise<boolean> {\n await ensureSchema()\n const res = await query(`DELETE FROM mem_secure_notes WHERE vault = $1 AND path = $2`, [vault, path])\n return (res.rowCount ?? 0) > 0\n}\n"],"mappings":"AAAA,SAAS,cAAc,aAAa;AACpC,SAAS,eAAe,qBAAqB;AAwB7C,MAAM,UAAU;AAEhB,SAAS,aAAa,OAAe,MAAsB;AACzD,SAAO,WAAW,KAAK,KAAK,IAAI;AAClC;AAEA,SAAS,OAAO,GAAuC;AACrD,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,OAAO,EAAE;AAAA,IACT,SAAS,cAAc,EAAE,WAAW;AAAA,IACpC,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,EACf;AACF;AAEA,eAAsB,cAAc,MAAuH;AACzJ,QAAM,aAAa;AACnB,QAAM,KAAK,aAAa,KAAK,OAAO,KAAK,IAAI;AAC7C,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA,iBAIa,OAAO;AAAA,IACpB,CAAC,IAAI,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,MAAM,cAAc,KAAK,OAAO,GAAG,KAAK,aAAa,IAAI;AAAA,EAC1G;AACA,SAAO,OAAO,IAAI,KAAK,CAAC,CAAC;AAC3B;AAEA,eAAsB,cAAc,OAAe,MAAgD;AACjG,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,CAAC,OAAO,IAAI;AAAA,EACd;AACA,SAAO,IAAI,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI;AAC7C;AAEA,eAAsB,gBAAgB,OAAmF;AACvH,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AACA,SAAO,IAAI,KAAK,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,WAAW,EAAE,WAAW,EAAE;AACtF;AAEA,eAAsB,iBAAiB,OAAe,MAAgC;AACpF,QAAM,aAAa;AACnB,QAAM,MAAM,MAAM,MAAM,+DAA+D,CAAC,OAAO,IAAI,CAAC;AACpG,UAAQ,IAAI,YAAY,KAAK;AAC/B;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
interface NotePermissions {
|
|
2
|
+
read: boolean;
|
|
3
|
+
edit: boolean;
|
|
4
|
+
delete: boolean;
|
|
5
|
+
reshare: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare function defaultNotePermissions(): NotePermissions;
|
|
8
|
+
declare function normalizeNotePermissions(input?: Partial<Record<keyof NotePermissions, boolean>>): NotePermissions;
|
|
9
|
+
type ShareStatus = 'pending' | 'accepted' | 'declined' | 'revoked';
|
|
10
|
+
interface NoteShare {
|
|
11
|
+
shareId: string;
|
|
12
|
+
noteId: string;
|
|
13
|
+
ownerIdentity: string;
|
|
14
|
+
srcVault: string;
|
|
15
|
+
srcPath: string;
|
|
16
|
+
grantee: string;
|
|
17
|
+
permissions: NotePermissions;
|
|
18
|
+
status: ShareStatus;
|
|
19
|
+
bundleRoot: string | null;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
}
|
|
23
|
+
declare function createShare(args: {
|
|
24
|
+
noteId: string;
|
|
25
|
+
ownerIdentity: string;
|
|
26
|
+
srcVault: string;
|
|
27
|
+
srcPath: string;
|
|
28
|
+
grantee: string;
|
|
29
|
+
permissions: NotePermissions;
|
|
30
|
+
bundleRoot?: string;
|
|
31
|
+
autoAccept?: boolean;
|
|
32
|
+
}): Promise<NoteShare>;
|
|
33
|
+
declare function getShare(shareId: string): Promise<NoteShare | null>;
|
|
34
|
+
declare function getShareByNoteAndGrantee(noteId: string, grantee: string): Promise<NoteShare | null>;
|
|
35
|
+
declare function getAcceptedShareByNoteAndGrantee(noteId: string, grantee: string): Promise<NoteShare | null>;
|
|
36
|
+
declare function listPendingForGrantee(grantee: string): Promise<NoteShare[]>;
|
|
37
|
+
declare function listAcceptedForGrantee(grantee: string): Promise<NoteShare[]>;
|
|
38
|
+
declare function acceptShareRow(shareId: string, grantee: string): Promise<NoteShare | null>;
|
|
39
|
+
declare function declineShareRow(shareId: string, grantee: string): Promise<NoteShare | null>;
|
|
40
|
+
declare function unlinkShareRow(shareId: string, grantee: string): Promise<boolean>;
|
|
41
|
+
declare function revokeShareRow(shareId: string, ownerIdentity: string): Promise<NoteShare | null>;
|
|
42
|
+
declare function deleteSharesForNote(noteId: string): Promise<number>;
|
|
43
|
+
declare function resolveAcceptedShare(shareId: string, grantee: string): Promise<NoteShare | null>;
|
|
44
|
+
|
|
45
|
+
export { type NotePermissions, type NoteShare, type ShareStatus, acceptShareRow, createShare, declineShareRow, defaultNotePermissions, deleteSharesForNote, getAcceptedShareByNoteAndGrantee, getShare, getShareByNoteAndGrantee, listAcceptedForGrantee, listPendingForGrantee, normalizeNotePermissions, resolveAcceptedShare, revokeShareRow, unlinkShareRow };
|