@elizaos/plugin-goals 2.0.3-beta.5 → 2.0.3-beta.7
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/dist/actions/goals.d.ts +16 -0
- package/dist/actions/goals.d.ts.map +1 -0
- package/dist/actions/goals.js +150 -0
- package/dist/actions/goals.js.map +1 -0
- package/dist/components/goals/GoalsSpatialView.d.ts +42 -0
- package/dist/components/goals/GoalsSpatialView.d.ts.map +1 -0
- package/dist/components/goals/GoalsSpatialView.js +149 -0
- package/dist/components/goals/GoalsSpatialView.js.map +1 -0
- package/dist/components/goals/GoalsView.d.ts +60 -0
- package/dist/components/goals/GoalsView.d.ts.map +1 -0
- package/dist/components/goals/GoalsView.js +150 -0
- package/dist/components/goals/GoalsView.js.map +1 -0
- package/dist/components/goals/goals-view-bundle.d.ts +2 -0
- package/dist/components/goals/goals-view-bundle.d.ts.map +1 -0
- package/dist/components/goals/goals-view-bundle.js +5 -0
- package/dist/components/goals/goals-view-bundle.js.map +1 -0
- package/dist/db/goals-repository.d.ts +54 -0
- package/dist/db/goals-repository.d.ts.map +1 -0
- package/dist/db/goals-repository.js +239 -0
- package/dist/db/goals-repository.js.map +1 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +2 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +826 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +61 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sql.d.ts +32 -0
- package/dist/db/sql.d.ts.map +1 -0
- package/dist/db/sql.js +130 -0
- package/dist/db/sql.js.map +1 -0
- package/dist/goal-grounding.d.ts +54 -0
- package/dist/goal-grounding.d.ts.map +1 -0
- package/dist/goal-grounding.js +148 -0
- package/dist/goal-grounding.js.map +1 -0
- package/dist/goal-normalize.d.ts +30 -0
- package/dist/goal-normalize.d.ts.map +1 -0
- package/dist/goal-normalize.js +99 -0
- package/dist/goal-normalize.js.map +1 -0
- package/dist/goal-semantic-evaluator.d.ts +12 -0
- package/dist/goal-semantic-evaluator.d.ts.map +1 -0
- package/dist/goal-semantic-evaluator.js +208 -0
- package/dist/goal-semantic-evaluator.js.map +1 -0
- package/dist/goals-runtime.d.ts +34 -0
- package/dist/goals-runtime.d.ts.map +1 -0
- package/dist/goals-runtime.js +44 -0
- package/dist/goals-runtime.js.map +1 -0
- package/dist/goals-service.d.ts +68 -0
- package/dist/goals-service.d.ts.map +1 -0
- package/dist/goals-service.js +293 -0
- package/dist/goals-service.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +13 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +47 -0
- package/dist/plugin.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +25 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +9 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +5 -0
- package/dist/register.js.map +1 -0
- package/dist/services/checkin.d.ts +23 -0
- package/dist/services/checkin.d.ts.map +1 -0
- package/dist/services/checkin.js +27 -0
- package/dist/services/checkin.js.map +1 -0
- package/dist/services/migration.d.ts +49 -0
- package/dist/services/migration.d.ts.map +1 -0
- package/dist/services/migration.js +113 -0
- package/dist/services/migration.js.map +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +53 -0
- package/dist/types.js.map +1 -0
- package/dist/views/bundle.js +304 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/goals/GoalsView.tsx"],"sourcesContent":["/**\n * GoalsView — the single GUI/XR data wrapper for the Goals surface.\n *\n * Data-fetching view over the single read-only goals endpoint served by the\n * personal-assistant routes (PA owns the persistence; this plugin only renders):\n * GET {base}/api/lifeops/goals\n *\n * The wire payload is `{ goals: LifeOpsGoalRecord[] }`, where each record is\n * `{ goal: LifeOpsGoalDefinition; links: LifeOpsGoalLink[] }`. We flatten each\n * record to a `GoalItem` at the fetch boundary so the rest of the view renders\n * display-only.\n *\n * It owns the fetch state machine (loading / error / ready), the status-filter\n * selection, and the quiet 20s background poll, then renders the one\n * presentational {@link GoalsSpatialView} inside a {@link SpatialSurface}.\n * Omitting the `modality` prop lets `SpatialSurface` auto-detect GUI vs XR via\n * `window.__elizaXRContext`, so the SAME component serves both surfaces. The\n * TUI surface renders the same `GoalsSpatialView` through the terminal registry\n * (see `register-terminal-view.tsx`).\n *\n * This plugin MUST NOT import from @elizaos/plugin-personal-assistant. The wire\n * DTOs below are declared locally to match the JSON shape PA emits\n * (LifeOpsGoalDefinition / LifeOpsGoalLink in @elizaos/shared).\n */\n\nimport { client } from \"@elizaos/ui\";\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n GOAL_STATUSES,\n type GoalItem,\n type GoalReviewState,\n type GoalStatus,\n} from \"../../types.js\";\nimport { type GoalsSnapshot, GoalsSpatialView } from \"./GoalsSpatialView.js\";\n\n// ---------------------------------------------------------------------------\n// Wire DTOs — local mirror of the JSON shape served by the PA goals route.\n// Never import PA / @elizaos/shared goal types here; keep this view's contract\n// self-contained and aligned by shape.\n// ---------------------------------------------------------------------------\n\ninterface GoalDefinitionWire {\n id: string;\n title: string;\n description: string;\n cadence: Record<string, unknown> | null;\n successCriteria: Record<string, unknown>;\n status: string;\n reviewState: string;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface GoalLinkWire {\n id: string;\n goalId: string;\n linkedType: string;\n linkedId: string;\n}\n\ninterface GoalRecordWire {\n goal: GoalDefinitionWire;\n links: GoalLinkWire[];\n}\n\ninterface GoalsWire {\n goals: GoalRecordWire[];\n}\n\n// ---------------------------------------------------------------------------\n// Fetcher seam — default to a real GET; tests inject an offline fake.\n// ---------------------------------------------------------------------------\n\nexport interface GoalsFetchers {\n fetchGoals: () => Promise<GoalsWire>;\n}\n\nasync function getGoals(): Promise<GoalsWire> {\n const response = await fetch(`${client.getBaseUrl()}/api/lifeops/goals`);\n if (!response.ok) {\n throw new Error(`Goals request failed (${response.status})`);\n }\n return (await response.json()) as GoalsWire;\n}\n\nconst defaultFetchers: GoalsFetchers = {\n fetchGoals: getGoals,\n};\n\nexport interface GoalsViewProps {\n /** Test/host injection seam. Defaults to the real `/api/lifeops/goals` GET. */\n fetchers?: GoalsFetchers;\n}\n\n// ---------------------------------------------------------------------------\n// Wire -> display DTO mapping.\n// ---------------------------------------------------------------------------\n\nconst KNOWN_STATUSES: ReadonlySet<string> = new Set(GOAL_STATUSES);\nconst KNOWN_REVIEW_STATES: ReadonlySet<string> = new Set([\n \"idle\",\n \"needs_attention\",\n \"on_track\",\n \"at_risk\",\n]);\n\n/** Coerce an unknown wire status to a known one; unknowns settle to \"active\". */\nfunction toStatus(value: string): GoalStatus {\n return KNOWN_STATUSES.has(value) ? (value as GoalStatus) : \"active\";\n}\n\n/** Coerce an unknown wire review state; unknowns settle to \"idle\". */\nfunction toReviewState(value: string): GoalReviewState {\n return KNOWN_REVIEW_STATES.has(value) ? (value as GoalReviewState) : \"idle\";\n}\n\n/** The cadence record carries a `kind` discriminator when present. */\nfunction readCadenceKind(\n cadence: Record<string, unknown> | null,\n): string | null {\n if (cadence && typeof cadence.kind === \"string\" && cadence.kind.length > 0) {\n return cadence.kind;\n }\n return null;\n}\n\n/**\n * successCriteria is a free-form record. We surface a human-readable target\n * only when it carries one of the conventional fields, otherwise null. Display\n * only — no derivation or math.\n */\nfunction readTarget(criteria: Record<string, unknown>): string | null {\n const candidate =\n criteria.targetText ??\n criteria.target ??\n criteria.summary ??\n criteria.deadline ??\n criteria.dueAt;\n if (typeof candidate === \"string\" && candidate.length > 0) return candidate;\n if (typeof candidate === \"number\") return String(candidate);\n return null;\n}\n\nfunction mapGoal(record: GoalRecordWire): GoalItem {\n const { goal, links } = record;\n return {\n id: goal.id,\n title: goal.title,\n description: goal.description ?? \"\",\n status: toStatus(goal.status),\n reviewState: toReviewState(goal.reviewState),\n cadenceKind: readCadenceKind(goal.cadence),\n target: readTarget(goal.successCriteria ?? {}),\n linkedCount: links.length,\n updatedAt: goal.updatedAt,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Fetch-driven state machine.\n// ---------------------------------------------------------------------------\n\ntype LoadState =\n | { kind: \"loading\" }\n | { kind: \"error\"; message: string }\n | { kind: \"ready\"; goals: GoalItem[] };\n\nfunction requestNewGoal(): void {\n client.sendChatMessage?.(\"Help me set a goal to head toward this quarter.\");\n}\n\nexport function GoalsView(props: GoalsViewProps = {}): ReactNode {\n const fetchers = props.fetchers ?? defaultFetchers;\n const [state, setState] = useState<LoadState>({ kind: \"loading\" });\n const [activeStatuses, setActiveStatuses] = useState<Set<GoalStatus>>(\n () => new Set<GoalStatus>(),\n );\n\n const fetchersRef = useRef(fetchers);\n fetchersRef.current = fetchers;\n\n const load = useCallback(() => {\n let cancelled = false;\n setState({ kind: \"loading\" });\n fetchersRef.current\n .fetchGoals()\n .then((wire) => {\n if (cancelled) return;\n setState({ kind: \"ready\", goals: wire.goals.map(mapGoal) });\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n setState({\n kind: \"error\",\n message:\n error instanceof Error ? error.message : \"Could not load goals.\",\n });\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n // Initial fetch on mount, then a quiet 20s background poll keeps the list\n // fresh (the view has no store subscription and there is no manual refresh).\n // The poll refetches silently: it never drops to the loading skeleton and a\n // transient poll failure leaves the current data on screen.\n useEffect(() => {\n const cancelInitial = load();\n let active = true;\n const interval = setInterval(() => {\n fetchersRef.current\n .fetchGoals()\n .then((wire) => {\n if (active)\n setState({ kind: \"ready\", goals: wire.goals.map(mapGoal) });\n })\n .catch(() => {\n /* keep the last good render on a transient poll failure */\n });\n }, 20000);\n return () => {\n active = false;\n clearInterval(interval);\n cancelInitial();\n };\n }, [load]);\n\n const toggleStatus = useCallback((status: GoalStatus) => {\n setActiveStatuses((prev) => {\n const next = new Set(prev);\n if (next.has(status)) next.delete(status);\n else next.add(status);\n return next;\n });\n }, []);\n\n const onAction = useCallback(\n (action: string) => {\n if (action.startsWith(\"filter:\")) {\n const raw = action.slice(\"filter:\".length);\n if (KNOWN_STATUSES.has(raw)) toggleStatus(raw as GoalStatus);\n return;\n }\n switch (action) {\n case \"retry\":\n load();\n return;\n case \"new\":\n requestNewGoal();\n return;\n }\n },\n [load, toggleStatus],\n );\n\n const snapshot: GoalsSnapshot = useMemo(() => {\n const activeList = Array.from(activeStatuses);\n if (state.kind === \"loading\") {\n return { status: \"loading\", goals: [], activeStatuses: activeList };\n }\n if (state.kind === \"error\") {\n return {\n status: \"error\",\n goals: [],\n activeStatuses: activeList,\n error: state.message,\n };\n }\n return { status: \"ready\", goals: state.goals, activeStatuses: activeList };\n }, [state, activeStatuses]);\n\n return (\n <SpatialSurface>\n <GoalsSpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n\nexport default GoalsView;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goals-view-bundle.d.ts","sourceRoot":"","sources":["../../../src/components/goals/goals-view-bundle.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/goals/goals-view-bundle.ts"],"sourcesContent":["// Vite view-bundle entry. The built bundle (dist/views/bundle.js) exposes the\n// named export `GoalsView` the view loader reads via __ELIZA_VIEW_EXPORT__.\n// Kept separate from GoalsView.tsx so that file exports only React components\n// and stays Fast-Refresh-compatible in dev.\nexport { GoalsView } from \"./GoalsView.js\";\n"],"mappings":"AAIA,SAAS,iBAAiB;","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw-SQL repository for the goals back-end.
|
|
3
|
+
*
|
|
4
|
+
* Owns all reads/writes against the goal tables (`life_goal_definitions`,
|
|
5
|
+
* `life_goal_links`), carved out of `@elizaos/plugin-personal-assistant`'s
|
|
6
|
+
* `app_lifeops` schema into this plugin's `app_goals` schema. PA's
|
|
7
|
+
* reminder/scheduling subsystem still reads + writes goal links
|
|
8
|
+
* (`upsertGoalLink` / `deleteGoalLinksForLinked`), but through PA's own
|
|
9
|
+
* repository, whose SQL was repointed to `app_goals` in the same carve — so a
|
|
10
|
+
* single owner backs every reader. The `deleteGoal` cross-schema writes to
|
|
11
|
+
* `app_lifeops.life_task_definitions` (spine FK-nullout) and
|
|
12
|
+
* `app_lifeops.life_audit_events` (audit) stay on `app_lifeops`.
|
|
13
|
+
*
|
|
14
|
+
* SQL execution + value encoding go through the self-contained {@link ./sql.ts}
|
|
15
|
+
* helpers, so this repository has no dependency on plugin-personal-assistant.
|
|
16
|
+
*/
|
|
17
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
18
|
+
import type { LifeOpsActor, LifeOpsAuditEventType, LifeOpsGoalDefinition, LifeOpsGoalLink, LifeOpsOwnerType } from "@elizaos/shared";
|
|
19
|
+
/**
|
|
20
|
+
* Build a fully-formed goal definition (assigning id + timestamps). Standalone
|
|
21
|
+
* successor to PA's `createLifeOpsGoalDefinition` factory.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createGoalDefinition(params: Omit<LifeOpsGoalDefinition, "id" | "createdAt" | "updatedAt">): LifeOpsGoalDefinition;
|
|
24
|
+
export declare class GoalsRepository {
|
|
25
|
+
private readonly runtime;
|
|
26
|
+
constructor(runtime: IAgentRuntime);
|
|
27
|
+
createGoal(goal: LifeOpsGoalDefinition): Promise<void>;
|
|
28
|
+
updateGoal(goal: LifeOpsGoalDefinition): Promise<void>;
|
|
29
|
+
getGoal(agentId: string, goalId: string): Promise<LifeOpsGoalDefinition | null>;
|
|
30
|
+
listGoals(agentId: string): Promise<LifeOpsGoalDefinition[]>;
|
|
31
|
+
deleteGoal(agentId: string, goalId: string): Promise<void>;
|
|
32
|
+
upsertGoalLink(link: LifeOpsGoalLink): Promise<void>;
|
|
33
|
+
deleteGoalLinksForLinked(agentId: string, linkedType: LifeOpsGoalLink["linkedType"], linkedId: string): Promise<void>;
|
|
34
|
+
listGoalLinksForGoal(agentId: string, goalId: string): Promise<LifeOpsGoalLink[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Append an audit event into PA's shared `app_lifeops.life_audit_events`
|
|
37
|
+
* table. Used by the standalone goals action's default `recordAudit` hook so
|
|
38
|
+
* goal creates/updates/deletes record exactly where PA records them. When PA
|
|
39
|
+
* is present it injects its own `recordAudit` (with the same SQL) instead.
|
|
40
|
+
*/
|
|
41
|
+
createAuditEvent(event: {
|
|
42
|
+
id: string;
|
|
43
|
+
agentId: string;
|
|
44
|
+
eventType: LifeOpsAuditEventType;
|
|
45
|
+
ownerType: LifeOpsOwnerType;
|
|
46
|
+
ownerId: string;
|
|
47
|
+
reason: string;
|
|
48
|
+
inputs: Record<string, unknown>;
|
|
49
|
+
decision: Record<string, unknown>;
|
|
50
|
+
actor: LifeOpsActor;
|
|
51
|
+
createdAt: string;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=goals-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goals-repository.d.ts","sourceRoot":"","sources":["../../src/db/goals-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAsFzB;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACpE,qBAAqB,CAQvB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE7C,UAAU,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BtD,UAAU,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBtD,OAAO,CACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAalC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAW5D,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1D,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpD,wBAAwB,CAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,EACzC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAUV,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC;IAY7B;;;;;OAKG;IACG,gBAAgB,CAAC,KAAK,EAAE;QAC5B,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,qBAAqB,CAAC;QACjC,SAAS,EAAE,gBAAgB,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,EAAE,YAAY,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBlB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
executeRawSql,
|
|
4
|
+
parseJsonRecord,
|
|
5
|
+
sqlJson,
|
|
6
|
+
sqlQuote,
|
|
7
|
+
toText
|
|
8
|
+
} from "./sql.js";
|
|
9
|
+
function parseOwnershipFields(row) {
|
|
10
|
+
const subjectType = toText(row.subject_type, "owner") === "agent" ? "agent" : "owner";
|
|
11
|
+
return {
|
|
12
|
+
domain: toText(
|
|
13
|
+
row.domain,
|
|
14
|
+
subjectType === "agent" ? "agent_ops" : "user_lifeops"
|
|
15
|
+
) === "agent_ops" ? "agent_ops" : "user_lifeops",
|
|
16
|
+
subjectType,
|
|
17
|
+
subjectId: toText(row.subject_id, toText(row.agent_id)),
|
|
18
|
+
visibilityScope: subjectType === "owner" ? "owner_only" : toText(row.visibility_scope, "agent_and_admin") === "owner_only" ? "owner_only" : toText(row.visibility_scope, "agent_and_admin") === "agent_and_admin" ? "agent_and_admin" : "owner_agent_admin",
|
|
19
|
+
contextPolicy: toText(
|
|
20
|
+
row.context_policy,
|
|
21
|
+
subjectType === "agent" ? "never" : "explicit_only"
|
|
22
|
+
) === "never" ? "never" : toText(
|
|
23
|
+
row.context_policy,
|
|
24
|
+
subjectType === "agent" ? "never" : "explicit_only"
|
|
25
|
+
) === "sidebar_only" ? "sidebar_only" : toText(
|
|
26
|
+
row.context_policy,
|
|
27
|
+
subjectType === "agent" ? "never" : "explicit_only"
|
|
28
|
+
) === "allowed_in_private_chat" ? "allowed_in_private_chat" : "explicit_only"
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function parseGoal(row) {
|
|
32
|
+
return {
|
|
33
|
+
id: toText(row.id),
|
|
34
|
+
agentId: toText(row.agent_id),
|
|
35
|
+
...parseOwnershipFields(row),
|
|
36
|
+
title: toText(row.title),
|
|
37
|
+
description: toText(row.description),
|
|
38
|
+
cadence: row.cadence_json ? parseJsonRecord(row.cadence_json) : null,
|
|
39
|
+
supportStrategy: parseJsonRecord(row.support_strategy_json),
|
|
40
|
+
successCriteria: parseJsonRecord(row.success_criteria_json),
|
|
41
|
+
status: toText(row.status),
|
|
42
|
+
reviewState: toText(
|
|
43
|
+
row.review_state
|
|
44
|
+
),
|
|
45
|
+
metadata: parseJsonRecord(row.metadata_json),
|
|
46
|
+
createdAt: toText(row.created_at),
|
|
47
|
+
updatedAt: toText(row.updated_at)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function parseGoalLink(row) {
|
|
51
|
+
return {
|
|
52
|
+
id: toText(row.id),
|
|
53
|
+
agentId: toText(row.agent_id),
|
|
54
|
+
goalId: toText(row.goal_id),
|
|
55
|
+
linkedType: toText(row.linked_type),
|
|
56
|
+
linkedId: toText(row.linked_id),
|
|
57
|
+
createdAt: toText(row.created_at)
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function isoNow() {
|
|
61
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
62
|
+
}
|
|
63
|
+
function createGoalDefinition(params) {
|
|
64
|
+
const timestamp = isoNow();
|
|
65
|
+
return {
|
|
66
|
+
...params,
|
|
67
|
+
id: crypto.randomUUID(),
|
|
68
|
+
createdAt: timestamp,
|
|
69
|
+
updatedAt: timestamp
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
class GoalsRepository {
|
|
73
|
+
constructor(runtime) {
|
|
74
|
+
this.runtime = runtime;
|
|
75
|
+
}
|
|
76
|
+
runtime;
|
|
77
|
+
async createGoal(goal) {
|
|
78
|
+
await executeRawSql(
|
|
79
|
+
this.runtime,
|
|
80
|
+
`INSERT INTO app_goals.life_goal_definitions (
|
|
81
|
+
id, agent_id, domain, subject_type, subject_id, visibility_scope,
|
|
82
|
+
context_policy, title, description, cadence_json, support_strategy_json,
|
|
83
|
+
success_criteria_json, status, review_state, metadata_json,
|
|
84
|
+
created_at, updated_at
|
|
85
|
+
) VALUES (
|
|
86
|
+
${sqlQuote(goal.id)},
|
|
87
|
+
${sqlQuote(goal.agentId)},
|
|
88
|
+
${sqlQuote(goal.domain)},
|
|
89
|
+
${sqlQuote(goal.subjectType)},
|
|
90
|
+
${sqlQuote(goal.subjectId)},
|
|
91
|
+
${sqlQuote(goal.visibilityScope)},
|
|
92
|
+
${sqlQuote(goal.contextPolicy)},
|
|
93
|
+
${sqlQuote(goal.title)},
|
|
94
|
+
${sqlQuote(goal.description)},
|
|
95
|
+
${goal.cadence ? sqlJson(goal.cadence) : "NULL"},
|
|
96
|
+
${sqlJson(goal.supportStrategy)},
|
|
97
|
+
${sqlJson(goal.successCriteria)},
|
|
98
|
+
${sqlQuote(goal.status)},
|
|
99
|
+
${sqlQuote(goal.reviewState)},
|
|
100
|
+
${sqlJson(goal.metadata)},
|
|
101
|
+
${sqlQuote(goal.createdAt)},
|
|
102
|
+
${sqlQuote(goal.updatedAt)}
|
|
103
|
+
)`
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
async updateGoal(goal) {
|
|
107
|
+
await executeRawSql(
|
|
108
|
+
this.runtime,
|
|
109
|
+
`UPDATE app_goals.life_goal_definitions
|
|
110
|
+
SET domain = ${sqlQuote(goal.domain)},
|
|
111
|
+
subject_type = ${sqlQuote(goal.subjectType)},
|
|
112
|
+
subject_id = ${sqlQuote(goal.subjectId)},
|
|
113
|
+
visibility_scope = ${sqlQuote(goal.visibilityScope)},
|
|
114
|
+
context_policy = ${sqlQuote(goal.contextPolicy)},
|
|
115
|
+
title = ${sqlQuote(goal.title)},
|
|
116
|
+
description = ${sqlQuote(goal.description)},
|
|
117
|
+
cadence_json = ${goal.cadence ? sqlJson(goal.cadence) : "NULL"},
|
|
118
|
+
support_strategy_json = ${sqlJson(goal.supportStrategy)},
|
|
119
|
+
success_criteria_json = ${sqlJson(goal.successCriteria)},
|
|
120
|
+
status = ${sqlQuote(goal.status)},
|
|
121
|
+
review_state = ${sqlQuote(goal.reviewState)},
|
|
122
|
+
metadata_json = ${sqlJson(goal.metadata)},
|
|
123
|
+
updated_at = ${sqlQuote(goal.updatedAt)}
|
|
124
|
+
WHERE id = ${sqlQuote(goal.id)}
|
|
125
|
+
AND agent_id = ${sqlQuote(goal.agentId)}`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
async getGoal(agentId, goalId) {
|
|
129
|
+
const rows = await executeRawSql(
|
|
130
|
+
this.runtime,
|
|
131
|
+
`SELECT *
|
|
132
|
+
FROM app_goals.life_goal_definitions
|
|
133
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
134
|
+
AND id = ${sqlQuote(goalId)}
|
|
135
|
+
LIMIT 1`
|
|
136
|
+
);
|
|
137
|
+
const row = rows[0];
|
|
138
|
+
return row ? parseGoal(row) : null;
|
|
139
|
+
}
|
|
140
|
+
async listGoals(agentId) {
|
|
141
|
+
const rows = await executeRawSql(
|
|
142
|
+
this.runtime,
|
|
143
|
+
`SELECT *
|
|
144
|
+
FROM app_goals.life_goal_definitions
|
|
145
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
146
|
+
ORDER BY created_at ASC`
|
|
147
|
+
);
|
|
148
|
+
return rows.map(parseGoal);
|
|
149
|
+
}
|
|
150
|
+
async deleteGoal(agentId, goalId) {
|
|
151
|
+
await executeRawSql(
|
|
152
|
+
this.runtime,
|
|
153
|
+
`DELETE FROM app_goals.life_goal_links
|
|
154
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
155
|
+
AND goal_id = ${sqlQuote(goalId)}`
|
|
156
|
+
);
|
|
157
|
+
await executeRawSql(
|
|
158
|
+
this.runtime,
|
|
159
|
+
`UPDATE app_lifeops.life_task_definitions
|
|
160
|
+
SET goal_id = NULL
|
|
161
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
162
|
+
AND goal_id = ${sqlQuote(goalId)}`
|
|
163
|
+
);
|
|
164
|
+
await executeRawSql(
|
|
165
|
+
this.runtime,
|
|
166
|
+
`DELETE FROM app_goals.life_goal_definitions
|
|
167
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
168
|
+
AND id = ${sqlQuote(goalId)}`
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
async upsertGoalLink(link) {
|
|
172
|
+
await executeRawSql(
|
|
173
|
+
this.runtime,
|
|
174
|
+
`INSERT INTO app_goals.life_goal_links (
|
|
175
|
+
id, agent_id, goal_id, linked_type, linked_id, created_at
|
|
176
|
+
) VALUES (
|
|
177
|
+
${sqlQuote(link.id)},
|
|
178
|
+
${sqlQuote(link.agentId)},
|
|
179
|
+
${sqlQuote(link.goalId)},
|
|
180
|
+
${sqlQuote(link.linkedType)},
|
|
181
|
+
${sqlQuote(link.linkedId)},
|
|
182
|
+
${sqlQuote(link.createdAt)}
|
|
183
|
+
)
|
|
184
|
+
ON CONFLICT(agent_id, goal_id, linked_type, linked_id) DO NOTHING`
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
async deleteGoalLinksForLinked(agentId, linkedType, linkedId) {
|
|
188
|
+
await executeRawSql(
|
|
189
|
+
this.runtime,
|
|
190
|
+
`DELETE FROM app_goals.life_goal_links
|
|
191
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
192
|
+
AND linked_type = ${sqlQuote(linkedType)}
|
|
193
|
+
AND linked_id = ${sqlQuote(linkedId)}`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
async listGoalLinksForGoal(agentId, goalId) {
|
|
197
|
+
const rows = await executeRawSql(
|
|
198
|
+
this.runtime,
|
|
199
|
+
`SELECT *
|
|
200
|
+
FROM app_goals.life_goal_links
|
|
201
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
202
|
+
AND goal_id = ${sqlQuote(goalId)}
|
|
203
|
+
ORDER BY created_at ASC`
|
|
204
|
+
);
|
|
205
|
+
return rows.map(parseGoalLink);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Append an audit event into PA's shared `app_lifeops.life_audit_events`
|
|
209
|
+
* table. Used by the standalone goals action's default `recordAudit` hook so
|
|
210
|
+
* goal creates/updates/deletes record exactly where PA records them. When PA
|
|
211
|
+
* is present it injects its own `recordAudit` (with the same SQL) instead.
|
|
212
|
+
*/
|
|
213
|
+
async createAuditEvent(event) {
|
|
214
|
+
await executeRawSql(
|
|
215
|
+
this.runtime,
|
|
216
|
+
`INSERT INTO app_lifeops.life_audit_events (
|
|
217
|
+
id, agent_id, event_type, owner_type, owner_id, reason,
|
|
218
|
+
inputs_json, decision_json, actor, created_at
|
|
219
|
+
) VALUES (
|
|
220
|
+
${sqlQuote(event.id)},
|
|
221
|
+
${sqlQuote(event.agentId)},
|
|
222
|
+
${sqlQuote(event.eventType)},
|
|
223
|
+
${sqlQuote(event.ownerType)},
|
|
224
|
+
${sqlQuote(event.ownerId)},
|
|
225
|
+
${sqlQuote(event.reason)},
|
|
226
|
+
${sqlJson(event.inputs)},
|
|
227
|
+
${sqlJson(event.decision)},
|
|
228
|
+
${sqlQuote(event.actor)},
|
|
229
|
+
${sqlQuote(event.createdAt)}
|
|
230
|
+
)
|
|
231
|
+
ON CONFLICT(id) DO NOTHING`
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export {
|
|
236
|
+
GoalsRepository,
|
|
237
|
+
createGoalDefinition
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=goals-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/goals-repository.ts"],"sourcesContent":["/**\n * Raw-SQL repository for the goals back-end.\n *\n * Owns all reads/writes against the goal tables (`life_goal_definitions`,\n * `life_goal_links`), carved out of `@elizaos/plugin-personal-assistant`'s\n * `app_lifeops` schema into this plugin's `app_goals` schema. PA's\n * reminder/scheduling subsystem still reads + writes goal links\n * (`upsertGoalLink` / `deleteGoalLinksForLinked`), but through PA's own\n * repository, whose SQL was repointed to `app_goals` in the same carve — so a\n * single owner backs every reader. The `deleteGoal` cross-schema writes to\n * `app_lifeops.life_task_definitions` (spine FK-nullout) and\n * `app_lifeops.life_audit_events` (audit) stay on `app_lifeops`.\n *\n * SQL execution + value encoding go through the self-contained {@link ./sql.ts}\n * helpers, so this repository has no dependency on plugin-personal-assistant.\n */\n\nimport crypto from \"node:crypto\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type {\n LifeOpsActor,\n LifeOpsAuditEventType,\n LifeOpsGoalDefinition,\n LifeOpsGoalLink,\n LifeOpsOwnerType,\n} from \"@elizaos/shared\";\nimport {\n executeRawSql,\n parseJsonRecord,\n sqlJson,\n sqlQuote,\n toText,\n} from \"./sql.js\";\n\nfunction parseOwnershipFields(row: Record<string, unknown>) {\n const subjectType =\n toText(row.subject_type, \"owner\") === \"agent\" ? \"agent\" : \"owner\";\n return {\n domain:\n toText(\n row.domain,\n subjectType === \"agent\" ? \"agent_ops\" : \"user_lifeops\",\n ) === \"agent_ops\"\n ? \"agent_ops\"\n : \"user_lifeops\",\n subjectType,\n subjectId: toText(row.subject_id, toText(row.agent_id)),\n visibilityScope:\n subjectType === \"owner\"\n ? \"owner_only\"\n : toText(row.visibility_scope, \"agent_and_admin\") === \"owner_only\"\n ? \"owner_only\"\n : toText(row.visibility_scope, \"agent_and_admin\") ===\n \"agent_and_admin\"\n ? \"agent_and_admin\"\n : \"owner_agent_admin\",\n contextPolicy:\n toText(\n row.context_policy,\n subjectType === \"agent\" ? \"never\" : \"explicit_only\",\n ) === \"never\"\n ? \"never\"\n : toText(\n row.context_policy,\n subjectType === \"agent\" ? \"never\" : \"explicit_only\",\n ) === \"sidebar_only\"\n ? \"sidebar_only\"\n : toText(\n row.context_policy,\n subjectType === \"agent\" ? \"never\" : \"explicit_only\",\n ) === \"allowed_in_private_chat\"\n ? \"allowed_in_private_chat\"\n : \"explicit_only\",\n } as const;\n}\n\nfunction parseGoal(row: Record<string, unknown>): LifeOpsGoalDefinition {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n ...parseOwnershipFields(row),\n title: toText(row.title),\n description: toText(row.description),\n cadence: row.cadence_json ? parseJsonRecord(row.cadence_json) : null,\n supportStrategy: parseJsonRecord(row.support_strategy_json),\n successCriteria: parseJsonRecord(row.success_criteria_json),\n status: toText(row.status) as LifeOpsGoalDefinition[\"status\"],\n reviewState: toText(\n row.review_state,\n ) as LifeOpsGoalDefinition[\"reviewState\"],\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseGoalLink(row: Record<string, unknown>): LifeOpsGoalLink {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n goalId: toText(row.goal_id),\n linkedType: toText(row.linked_type) as LifeOpsGoalLink[\"linkedType\"],\n linkedId: toText(row.linked_id),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\n/**\n * Build a fully-formed goal definition (assigning id + timestamps). Standalone\n * successor to PA's `createLifeOpsGoalDefinition` factory.\n */\nexport function createGoalDefinition(\n params: Omit<LifeOpsGoalDefinition, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsGoalDefinition {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport class GoalsRepository {\n constructor(private readonly runtime: IAgentRuntime) {}\n\n async createGoal(goal: LifeOpsGoalDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_goals.life_goal_definitions (\n id, agent_id, domain, subject_type, subject_id, visibility_scope,\n context_policy, title, description, cadence_json, support_strategy_json,\n success_criteria_json, status, review_state, metadata_json,\n created_at, updated_at\n ) VALUES (\n ${sqlQuote(goal.id)},\n ${sqlQuote(goal.agentId)},\n ${sqlQuote(goal.domain)},\n ${sqlQuote(goal.subjectType)},\n ${sqlQuote(goal.subjectId)},\n ${sqlQuote(goal.visibilityScope)},\n ${sqlQuote(goal.contextPolicy)},\n ${sqlQuote(goal.title)},\n ${sqlQuote(goal.description)},\n ${goal.cadence ? sqlJson(goal.cadence) : \"NULL\"},\n ${sqlJson(goal.supportStrategy)},\n ${sqlJson(goal.successCriteria)},\n ${sqlQuote(goal.status)},\n ${sqlQuote(goal.reviewState)},\n ${sqlJson(goal.metadata)},\n ${sqlQuote(goal.createdAt)},\n ${sqlQuote(goal.updatedAt)}\n )`,\n );\n }\n\n async updateGoal(goal: LifeOpsGoalDefinition): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE app_goals.life_goal_definitions\n SET domain = ${sqlQuote(goal.domain)},\n subject_type = ${sqlQuote(goal.subjectType)},\n subject_id = ${sqlQuote(goal.subjectId)},\n visibility_scope = ${sqlQuote(goal.visibilityScope)},\n context_policy = ${sqlQuote(goal.contextPolicy)},\n title = ${sqlQuote(goal.title)},\n description = ${sqlQuote(goal.description)},\n cadence_json = ${goal.cadence ? sqlJson(goal.cadence) : \"NULL\"},\n support_strategy_json = ${sqlJson(goal.supportStrategy)},\n success_criteria_json = ${sqlJson(goal.successCriteria)},\n status = ${sqlQuote(goal.status)},\n review_state = ${sqlQuote(goal.reviewState)},\n metadata_json = ${sqlJson(goal.metadata)},\n updated_at = ${sqlQuote(goal.updatedAt)}\n WHERE id = ${sqlQuote(goal.id)}\n AND agent_id = ${sqlQuote(goal.agentId)}`,\n );\n }\n\n async getGoal(\n agentId: string,\n goalId: string,\n ): Promise<LifeOpsGoalDefinition | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_goals.life_goal_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(goalId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseGoal(row) : null;\n }\n\n async listGoals(agentId: string): Promise<LifeOpsGoalDefinition[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_goals.life_goal_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseGoal);\n }\n\n async deleteGoal(agentId: string, goalId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND goal_id = ${sqlQuote(goalId)}`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE app_lifeops.life_task_definitions\n SET goal_id = NULL\n WHERE agent_id = ${sqlQuote(agentId)}\n AND goal_id = ${sqlQuote(goalId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_definitions\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(goalId)}`,\n );\n }\n\n async upsertGoalLink(link: LifeOpsGoalLink): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_goals.life_goal_links (\n id, agent_id, goal_id, linked_type, linked_id, created_at\n ) VALUES (\n ${sqlQuote(link.id)},\n ${sqlQuote(link.agentId)},\n ${sqlQuote(link.goalId)},\n ${sqlQuote(link.linkedType)},\n ${sqlQuote(link.linkedId)},\n ${sqlQuote(link.createdAt)}\n )\n ON CONFLICT(agent_id, goal_id, linked_type, linked_id) DO NOTHING`,\n );\n }\n\n async deleteGoalLinksForLinked(\n agentId: string,\n linkedType: LifeOpsGoalLink[\"linkedType\"],\n linkedId: string,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND linked_type = ${sqlQuote(linkedType)}\n AND linked_id = ${sqlQuote(linkedId)}`,\n );\n }\n\n async listGoalLinksForGoal(\n agentId: string,\n goalId: string,\n ): Promise<LifeOpsGoalLink[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM app_goals.life_goal_links\n WHERE agent_id = ${sqlQuote(agentId)}\n AND goal_id = ${sqlQuote(goalId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseGoalLink);\n }\n\n /**\n * Append an audit event into PA's shared `app_lifeops.life_audit_events`\n * table. Used by the standalone goals action's default `recordAudit` hook so\n * goal creates/updates/deletes record exactly where PA records them. When PA\n * is present it injects its own `recordAudit` (with the same SQL) instead.\n */\n async createAuditEvent(event: {\n id: string;\n agentId: string;\n eventType: LifeOpsAuditEventType;\n ownerType: LifeOpsOwnerType;\n ownerId: string;\n reason: string;\n inputs: Record<string, unknown>;\n decision: Record<string, unknown>;\n actor: LifeOpsActor;\n createdAt: string;\n }): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO app_lifeops.life_audit_events (\n id, agent_id, event_type, owner_type, owner_id, reason,\n inputs_json, decision_json, actor, created_at\n ) VALUES (\n ${sqlQuote(event.id)},\n ${sqlQuote(event.agentId)},\n ${sqlQuote(event.eventType)},\n ${sqlQuote(event.ownerType)},\n ${sqlQuote(event.ownerId)},\n ${sqlQuote(event.reason)},\n ${sqlJson(event.inputs)},\n ${sqlJson(event.decision)},\n ${sqlQuote(event.actor)},\n ${sqlQuote(event.createdAt)}\n )\n ON CONFLICT(id) DO NOTHING`,\n );\n }\n}\n"],"mappings":"AAiBA,OAAO,YAAY;AASnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB,KAA8B;AAC1D,QAAM,cACJ,OAAO,IAAI,cAAc,OAAO,MAAM,UAAU,UAAU;AAC5D,SAAO;AAAA,IACL,QACE;AAAA,MACE,IAAI;AAAA,MACJ,gBAAgB,UAAU,cAAc;AAAA,IAC1C,MAAM,cACF,cACA;AAAA,IACN;AAAA,IACA,WAAW,OAAO,IAAI,YAAY,OAAO,IAAI,QAAQ,CAAC;AAAA,IACtD,iBACE,gBAAgB,UACZ,eACA,OAAO,IAAI,kBAAkB,iBAAiB,MAAM,eAClD,eACA,OAAO,IAAI,kBAAkB,iBAAiB,MAC5C,oBACA,oBACA;AAAA,IACV,eACE;AAAA,MACE,IAAI;AAAA,MACJ,gBAAgB,UAAU,UAAU;AAAA,IACtC,MAAM,UACF,UACA;AAAA,MACI,IAAI;AAAA,MACJ,gBAAgB,UAAU,UAAU;AAAA,IACtC,MAAM,iBACN,iBACA;AAAA,MACI,IAAI;AAAA,MACJ,gBAAgB,UAAU,UAAU;AAAA,IACtC,MAAM,4BACN,4BACA;AAAA,EACZ;AACF;AAEA,SAAS,UAAU,KAAqD;AACtE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,QAAQ;AAAA,IAC5B,GAAG,qBAAqB,GAAG;AAAA,IAC3B,OAAO,OAAO,IAAI,KAAK;AAAA,IACvB,aAAa,OAAO,IAAI,WAAW;AAAA,IACnC,SAAS,IAAI,eAAe,gBAAgB,IAAI,YAAY,IAAI;AAAA,IAChE,iBAAiB,gBAAgB,IAAI,qBAAqB;AAAA,IAC1D,iBAAiB,gBAAgB,IAAI,qBAAqB;AAAA,IAC1D,QAAQ,OAAO,IAAI,MAAM;AAAA,IACzB,aAAa;AAAA,MACX,IAAI;AAAA,IACN;AAAA,IACA,UAAU,gBAAgB,IAAI,aAAa;AAAA,IAC3C,WAAW,OAAO,IAAI,UAAU;AAAA,IAChC,WAAW,OAAO,IAAI,UAAU;AAAA,EAClC;AACF;AAEA,SAAS,cAAc,KAA+C;AACpE,SAAO;AAAA,IACL,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,SAAS,OAAO,IAAI,QAAQ;AAAA,IAC5B,QAAQ,OAAO,IAAI,OAAO;AAAA,IAC1B,YAAY,OAAO,IAAI,WAAW;AAAA,IAClC,UAAU,OAAO,IAAI,SAAS;AAAA,IAC9B,WAAW,OAAO,IAAI,UAAU;AAAA,EAClC;AACF;AAEA,SAAS,SAAiB;AACxB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAMO,SAAS,qBACd,QACuB;AACvB,QAAM,YAAY,OAAO;AACzB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,OAAO,WAAW;AAAA,IACtB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEO,MAAM,gBAAgB;AAAA,EAC3B,YAA6B,SAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,MAAM,WAAW,MAA4C;AAC3D,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMI,SAAS,KAAK,EAAE,CAAC;AAAA,UACjB,SAAS,KAAK,OAAO,CAAC;AAAA,UACtB,SAAS,KAAK,MAAM,CAAC;AAAA,UACrB,SAAS,KAAK,WAAW,CAAC;AAAA,UAC1B,SAAS,KAAK,SAAS,CAAC;AAAA,UACxB,SAAS,KAAK,eAAe,CAAC;AAAA,UAC9B,SAAS,KAAK,aAAa,CAAC;AAAA,UAC5B,SAAS,KAAK,KAAK,CAAC;AAAA,UACpB,SAAS,KAAK,WAAW,CAAC;AAAA,UAC1B,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,MAAM;AAAA,UAC7C,QAAQ,KAAK,eAAe,CAAC;AAAA,UAC7B,QAAQ,KAAK,eAAe,CAAC;AAAA,UAC7B,SAAS,KAAK,MAAM,CAAC;AAAA,UACrB,SAAS,KAAK,WAAW,CAAC;AAAA,UAC1B,QAAQ,KAAK,QAAQ,CAAC;AAAA,UACtB,SAAS,KAAK,SAAS,CAAC;AAAA,UACxB,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,IAE9B;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAA4C;AAC3D,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,yBACmB,SAAS,KAAK,MAAM,CAAC;AAAA,+BACf,SAAS,KAAK,WAAW,CAAC;AAAA,6BAC5B,SAAS,KAAK,SAAS,CAAC;AAAA,mCAClB,SAAS,KAAK,eAAe,CAAC;AAAA,iCAChC,SAAS,KAAK,aAAa,CAAC;AAAA,wBACrC,SAAS,KAAK,KAAK,CAAC;AAAA,8BACd,SAAS,KAAK,WAAW,CAAC;AAAA,+BACzB,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,MAAM;AAAA,wCACpC,QAAQ,KAAK,eAAe,CAAC;AAAA,wCAC7B,QAAQ,KAAK,eAAe,CAAC;AAAA,yBAC5C,SAAS,KAAK,MAAM,CAAC;AAAA,+BACf,SAAS,KAAK,WAAW,CAAC;AAAA,gCACzB,QAAQ,KAAK,QAAQ,CAAC;AAAA,6BACzB,SAAS,KAAK,SAAS,CAAC;AAAA,qBAChC,SAAS,KAAK,EAAE,CAAC;AAAA,2BACX,SAAS,KAAK,OAAO,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,SACA,QACuC;AACvC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,2BAEqB,SAAS,OAAO,CAAC;AAAA,qBACvB,SAAS,MAAM,CAAC;AAAA;AAAA,IAEjC;AACA,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO,MAAM,UAAU,GAAG,IAAI;AAAA,EAChC;AAAA,EAEA,MAAM,UAAU,SAAmD;AACjE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,2BAEqB,SAAS,OAAO,CAAC;AAAA;AAAA,IAExC;AACA,WAAO,KAAK,IAAI,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAM,WAAW,SAAiB,QAA+B;AAC/D,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,2BACqB,SAAS,OAAO,CAAC;AAAA,0BAClB,SAAS,MAAM,CAAC;AAAA,IACtC;AACA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA,0BAEoB,SAAS,OAAO,CAAC;AAAA,yBAClB,SAAS,MAAM,CAAC;AAAA,IACrC;AACA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,2BACqB,SAAS,OAAO,CAAC;AAAA,qBACvB,SAAS,MAAM,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,MAAsC;AACzD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,UAGI,SAAS,KAAK,EAAE,CAAC;AAAA,UACjB,SAAS,KAAK,OAAO,CAAC;AAAA,UACtB,SAAS,KAAK,MAAM,CAAC;AAAA,UACrB,SAAS,KAAK,UAAU,CAAC;AAAA,UACzB,SAAS,KAAK,QAAQ,CAAC;AAAA,UACvB,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA;AAAA,IAG9B;AAAA,EACF;AAAA,EAEA,MAAM,yBACJ,SACA,YACA,UACe;AACf,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,2BACqB,SAAS,OAAO,CAAC;AAAA,8BACd,SAAS,UAAU,CAAC;AAAA,4BACtB,SAAS,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,SACA,QAC4B;AAC5B,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,2BAEqB,SAAS,OAAO,CAAC;AAAA,0BAClB,SAAS,MAAM,CAAC;AAAA;AAAA,IAEtC;AACA,WAAO,KAAK,IAAI,aAAa;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,OAWL;AAChB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,UAII,SAAS,MAAM,EAAE,CAAC;AAAA,UAClB,SAAS,MAAM,OAAO,CAAC;AAAA,UACvB,SAAS,MAAM,SAAS,CAAC;AAAA,UACzB,SAAS,MAAM,SAAS,CAAC;AAAA,UACzB,SAAS,MAAM,OAAO,CAAC;AAAA,UACvB,SAAS,MAAM,MAAM,CAAC;AAAA,UACtB,QAAQ,MAAM,MAAM,CAAC;AAAA,UACrB,QAAQ,MAAM,QAAQ,CAAC;AAAA,UACvB,SAAS,MAAM,KAAK,CAAC;AAAA,UACrB,SAAS,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA,IAG/B;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["export * from \"./schema.js\";\n"],"mappings":"AAAA,cAAc;","names":[]}
|