@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.
Files changed (83) hide show
  1. package/dist/actions/goals.d.ts +16 -0
  2. package/dist/actions/goals.d.ts.map +1 -0
  3. package/dist/actions/goals.js +150 -0
  4. package/dist/actions/goals.js.map +1 -0
  5. package/dist/components/goals/GoalsSpatialView.d.ts +42 -0
  6. package/dist/components/goals/GoalsSpatialView.d.ts.map +1 -0
  7. package/dist/components/goals/GoalsSpatialView.js +149 -0
  8. package/dist/components/goals/GoalsSpatialView.js.map +1 -0
  9. package/dist/components/goals/GoalsView.d.ts +60 -0
  10. package/dist/components/goals/GoalsView.d.ts.map +1 -0
  11. package/dist/components/goals/GoalsView.js +150 -0
  12. package/dist/components/goals/GoalsView.js.map +1 -0
  13. package/dist/components/goals/goals-view-bundle.d.ts +2 -0
  14. package/dist/components/goals/goals-view-bundle.d.ts.map +1 -0
  15. package/dist/components/goals/goals-view-bundle.js +5 -0
  16. package/dist/components/goals/goals-view-bundle.js.map +1 -0
  17. package/dist/db/goals-repository.d.ts +54 -0
  18. package/dist/db/goals-repository.d.ts.map +1 -0
  19. package/dist/db/goals-repository.js +239 -0
  20. package/dist/db/goals-repository.js.map +1 -0
  21. package/dist/db/index.d.ts +2 -0
  22. package/dist/db/index.d.ts.map +1 -0
  23. package/dist/db/index.js +2 -0
  24. package/dist/db/index.js.map +1 -0
  25. package/dist/db/schema.d.ts +826 -0
  26. package/dist/db/schema.d.ts.map +1 -0
  27. package/dist/db/schema.js +61 -0
  28. package/dist/db/schema.js.map +1 -0
  29. package/dist/db/sql.d.ts +32 -0
  30. package/dist/db/sql.d.ts.map +1 -0
  31. package/dist/db/sql.js +130 -0
  32. package/dist/db/sql.js.map +1 -0
  33. package/dist/goal-grounding.d.ts +54 -0
  34. package/dist/goal-grounding.d.ts.map +1 -0
  35. package/dist/goal-grounding.js +148 -0
  36. package/dist/goal-grounding.js.map +1 -0
  37. package/dist/goal-normalize.d.ts +30 -0
  38. package/dist/goal-normalize.d.ts.map +1 -0
  39. package/dist/goal-normalize.js +99 -0
  40. package/dist/goal-normalize.js.map +1 -0
  41. package/dist/goal-semantic-evaluator.d.ts +12 -0
  42. package/dist/goal-semantic-evaluator.d.ts.map +1 -0
  43. package/dist/goal-semantic-evaluator.js +208 -0
  44. package/dist/goal-semantic-evaluator.js.map +1 -0
  45. package/dist/goals-runtime.d.ts +34 -0
  46. package/dist/goals-runtime.d.ts.map +1 -0
  47. package/dist/goals-runtime.js +44 -0
  48. package/dist/goals-runtime.js.map +1 -0
  49. package/dist/goals-service.d.ts +68 -0
  50. package/dist/goals-service.d.ts.map +1 -0
  51. package/dist/goals-service.js +293 -0
  52. package/dist/goals-service.js.map +1 -0
  53. package/dist/index.d.ts +14 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +59 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/plugin.d.ts +13 -0
  58. package/dist/plugin.d.ts.map +1 -0
  59. package/dist/plugin.js +47 -0
  60. package/dist/plugin.js.map +1 -0
  61. package/dist/register-terminal-view.d.ts +15 -0
  62. package/dist/register-terminal-view.d.ts.map +1 -0
  63. package/dist/register-terminal-view.js +25 -0
  64. package/dist/register-terminal-view.js.map +1 -0
  65. package/dist/register.d.ts +9 -0
  66. package/dist/register.d.ts.map +1 -0
  67. package/dist/register.js +5 -0
  68. package/dist/register.js.map +1 -0
  69. package/dist/services/checkin.d.ts +23 -0
  70. package/dist/services/checkin.d.ts.map +1 -0
  71. package/dist/services/checkin.js +27 -0
  72. package/dist/services/checkin.js.map +1 -0
  73. package/dist/services/migration.d.ts +49 -0
  74. package/dist/services/migration.d.ts.map +1 -0
  75. package/dist/services/migration.js +113 -0
  76. package/dist/services/migration.js.map +1 -0
  77. package/dist/types.d.ts +49 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +53 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/views/bundle.js +304 -0
  82. package/dist/views/bundle.js.map +1 -0
  83. package/package.json +9 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,qDAAwB,CAAC;AAEjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B/B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAezB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AACxE,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { index, pgSchema, text, unique } from "drizzle-orm/pg-core";
2
+ const goalsSchema = pgSchema("app_goals");
3
+ const lifeGoalDefinitions = goalsSchema.table(
4
+ "life_goal_definitions",
5
+ {
6
+ id: text("id").primaryKey(),
7
+ agentId: text("agent_id").notNull(),
8
+ domain: text("domain").notNull().default("user_lifeops"),
9
+ subjectType: text("subject_type").notNull().default("owner"),
10
+ subjectId: text("subject_id").notNull(),
11
+ visibilityScope: text("visibility_scope").notNull().default("owner_only"),
12
+ contextPolicy: text("context_policy").notNull().default("explicit_only"),
13
+ title: text("title").notNull(),
14
+ description: text("description").notNull().default(""),
15
+ cadenceJson: text("cadence_json"),
16
+ supportStrategyJson: text("support_strategy_json").notNull().default("{}"),
17
+ successCriteriaJson: text("success_criteria_json").notNull().default("{}"),
18
+ status: text("status").notNull().default("active"),
19
+ reviewState: text("review_state").notNull().default("pending"),
20
+ metadataJson: text("metadata_json").notNull().default("{}"),
21
+ createdAt: text("created_at").notNull(),
22
+ updatedAt: text("updated_at").notNull()
23
+ },
24
+ (t) => [
25
+ index("idx_life_goal_definitions_agent_status").on(t.agentId, t.status),
26
+ index("idx_life_goal_definitions_subject").on(
27
+ t.agentId,
28
+ t.domain,
29
+ t.subjectType,
30
+ t.subjectId,
31
+ t.status
32
+ )
33
+ ]
34
+ );
35
+ const lifeGoalLinks = goalsSchema.table(
36
+ "life_goal_links",
37
+ {
38
+ id: text("id").primaryKey(),
39
+ agentId: text("agent_id").notNull(),
40
+ goalId: text("goal_id").notNull(),
41
+ linkedType: text("linked_type").notNull(),
42
+ linkedId: text("linked_id").notNull(),
43
+ createdAt: text("created_at").notNull()
44
+ },
45
+ (t) => [
46
+ unique().on(t.agentId, t.goalId, t.linkedType, t.linkedId),
47
+ index("idx_life_goal_links_goal").on(t.goalId),
48
+ index("idx_life_goal_links_linked").on(t.linkedType, t.linkedId)
49
+ ]
50
+ );
51
+ const goalsDbSchema = {
52
+ lifeGoalDefinitions,
53
+ lifeGoalLinks
54
+ };
55
+ export {
56
+ goalsDbSchema,
57
+ goalsSchema,
58
+ lifeGoalDefinitions,
59
+ lifeGoalLinks
60
+ };
61
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/db/schema.ts"],"sourcesContent":["import { index, pgSchema, text, unique } from \"drizzle-orm/pg-core\";\n\n/**\n * Drizzle schema for plugin-goals.\n *\n * The goal tables (`life_goal_definitions`, `life_goal_links`) were carved out\n * of `@elizaos/plugin-personal-assistant`'s `app_lifeops` schema into\n * `app_goals`, owned by this plugin. Table + column names (and column order) are\n * preserved verbatim so the non-destructive `GoalsMigrationService` can copy\n * existing `app_lifeops` rows across on first boot. The runtime registers this\n * schema through `@elizaos/plugin-sql`.\n */\nexport const goalsSchema = pgSchema(\"app_goals\");\n\nexport const lifeGoalDefinitions = goalsSchema.table(\n \"life_goal_definitions\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n domain: text(\"domain\").notNull().default(\"user_lifeops\"),\n subjectType: text(\"subject_type\").notNull().default(\"owner\"),\n subjectId: text(\"subject_id\").notNull(),\n visibilityScope: text(\"visibility_scope\").notNull().default(\"owner_only\"),\n contextPolicy: text(\"context_policy\").notNull().default(\"explicit_only\"),\n title: text(\"title\").notNull(),\n description: text(\"description\").notNull().default(\"\"),\n cadenceJson: text(\"cadence_json\"),\n supportStrategyJson: text(\"support_strategy_json\").notNull().default(\"{}\"),\n successCriteriaJson: text(\"success_criteria_json\").notNull().default(\"{}\"),\n status: text(\"status\").notNull().default(\"active\"),\n reviewState: text(\"review_state\").notNull().default(\"pending\"),\n metadataJson: text(\"metadata_json\").notNull().default(\"{}\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n index(\"idx_life_goal_definitions_agent_status\").on(t.agentId, t.status),\n index(\"idx_life_goal_definitions_subject\").on(\n t.agentId,\n t.domain,\n t.subjectType,\n t.subjectId,\n t.status,\n ),\n ],\n);\n\nexport const lifeGoalLinks = goalsSchema.table(\n \"life_goal_links\",\n {\n id: text(\"id\").primaryKey(),\n agentId: text(\"agent_id\").notNull(),\n goalId: text(\"goal_id\").notNull(),\n linkedType: text(\"linked_type\").notNull(),\n linkedId: text(\"linked_id\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n },\n (t) => [\n unique().on(t.agentId, t.goalId, t.linkedType, t.linkedId),\n index(\"idx_life_goal_links_goal\").on(t.goalId),\n index(\"idx_life_goal_links_linked\").on(t.linkedType, t.linkedId),\n ],\n);\n\nexport const goalsDbSchema = {\n lifeGoalDefinitions,\n lifeGoalLinks,\n} as const;\n\nexport type GoalDefinitionRow = typeof lifeGoalDefinitions.$inferSelect;\nexport type GoalLinkRow = typeof lifeGoalLinks.$inferSelect;\n"],"mappings":"AAAA,SAAS,OAAO,UAAU,MAAM,cAAc;AAYvC,MAAM,cAAc,SAAS,WAAW;AAExC,MAAM,sBAAsB,YAAY;AAAA,EAC7C;AAAA,EACA;AAAA,IACE,IAAI,KAAK,IAAI,EAAE,WAAW;AAAA,IAC1B,SAAS,KAAK,UAAU,EAAE,QAAQ;AAAA,IAClC,QAAQ,KAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,cAAc;AAAA,IACvD,aAAa,KAAK,cAAc,EAAE,QAAQ,EAAE,QAAQ,OAAO;AAAA,IAC3D,WAAW,KAAK,YAAY,EAAE,QAAQ;AAAA,IACtC,iBAAiB,KAAK,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,YAAY;AAAA,IACxE,eAAe,KAAK,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,eAAe;AAAA,IACvE,OAAO,KAAK,OAAO,EAAE,QAAQ;AAAA,IAC7B,aAAa,KAAK,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA,IACrD,aAAa,KAAK,cAAc;AAAA,IAChC,qBAAqB,KAAK,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACzE,qBAAqB,KAAK,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACzE,QAAQ,KAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,QAAQ;AAAA,IACjD,aAAa,KAAK,cAAc,EAAE,QAAQ,EAAE,QAAQ,SAAS;AAAA,IAC7D,cAAc,KAAK,eAAe,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAC1D,WAAW,KAAK,YAAY,EAAE,QAAQ;AAAA,IACtC,WAAW,KAAK,YAAY,EAAE,QAAQ;AAAA,EACxC;AAAA,EACA,CAAC,MAAM;AAAA,IACL,MAAM,wCAAwC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM;AAAA,IACtE,MAAM,mCAAmC,EAAE;AAAA,MACzC,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AACF;AAEO,MAAM,gBAAgB,YAAY;AAAA,EACvC;AAAA,EACA;AAAA,IACE,IAAI,KAAK,IAAI,EAAE,WAAW;AAAA,IAC1B,SAAS,KAAK,UAAU,EAAE,QAAQ;AAAA,IAClC,QAAQ,KAAK,SAAS,EAAE,QAAQ;AAAA,IAChC,YAAY,KAAK,aAAa,EAAE,QAAQ;AAAA,IACxC,UAAU,KAAK,WAAW,EAAE,QAAQ;AAAA,IACpC,WAAW,KAAK,YAAY,EAAE,QAAQ;AAAA,EACxC;AAAA,EACA,CAAC,MAAM;AAAA,IACL,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ;AAAA,IACzD,MAAM,0BAA0B,EAAE,GAAG,EAAE,MAAM;AAAA,IAC7C,MAAM,4BAA4B,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ;AAAA,EACjE;AACF;AAEO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AACF;","names":[]}
@@ -0,0 +1,32 @@
1
+ import type { IAgentRuntime } from "@elizaos/core";
2
+ /**
3
+ * Self-contained raw-SQL helpers for the goals back-end. Copied verbatim from
4
+ * the PA LifeOps sql helpers (renamed error prefixes) so this plugin carries no
5
+ * dependency on `@elizaos/plugin-personal-assistant`. Keep in sync only when a
6
+ * correctness fix applies to both; do not add goals-specific logic here.
7
+ */
8
+ export type RawSqlQuery = {
9
+ queryChunks: Array<{
10
+ value?: unknown;
11
+ }>;
12
+ };
13
+ export type RuntimeDb = {
14
+ execute: (query: RawSqlQuery) => Promise<unknown>;
15
+ };
16
+ export declare function asObject(value: unknown): Record<string, unknown> | null;
17
+ export declare function toText(value: unknown, fallback?: string): string;
18
+ export declare function toNumber(value: unknown, fallback?: number): number;
19
+ export declare function toBoolean(value: unknown, fallback?: boolean): boolean;
20
+ export declare function parseJsonValue<T>(value: unknown, fallback: T): T;
21
+ export declare function parseJsonRecord(value: unknown): Record<string, unknown>;
22
+ export declare function parseJsonArray<T>(value: unknown): T[];
23
+ export declare function extractRows(result: unknown): Array<Record<string, unknown>>;
24
+ export declare function getRuntimeDb(runtime: IAgentRuntime): RuntimeDb;
25
+ export declare function executeRawSql(runtime: IAgentRuntime, sqlText: string): Promise<Array<Record<string, unknown>>>;
26
+ export declare function sqlQuote(value: string): string;
27
+ export declare function sqlText(value: string | null | undefined): string;
28
+ export declare function sqlInteger(value: number | null | undefined): string;
29
+ export declare function sqlNumber(value: number | null | undefined): string;
30
+ export declare function sqlBoolean(value: boolean): string;
31
+ export declare function sqlJson(value: unknown): string;
32
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/db/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnD,CAAC;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGvE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,CAI5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAI,GAAG,MAAM,CAO7D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,UAAQ,GAAG,OAAO,CASnE;AAMD,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAchE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMvE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,EAAE,CAKrD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAa3E;AAWD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CAM9D;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAKzC;AAMD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGhE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAInE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE9C"}
package/dist/db/sql.js ADDED
@@ -0,0 +1,130 @@
1
+ let cachedSqlRaw = null;
2
+ function asObject(value) {
3
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
4
+ return value;
5
+ }
6
+ function toText(value, fallback = "") {
7
+ if (typeof value === "string") return value;
8
+ if (value === null || value === void 0) return fallback;
9
+ return String(value);
10
+ }
11
+ function toNumber(value, fallback = 0) {
12
+ if (typeof value === "number" && Number.isFinite(value)) return value;
13
+ if (typeof value === "string") {
14
+ const parsed = Number(value);
15
+ if (Number.isFinite(parsed)) return parsed;
16
+ }
17
+ return fallback;
18
+ }
19
+ function toBoolean(value, fallback = false) {
20
+ if (typeof value === "boolean") return value;
21
+ if (typeof value === "number") return value !== 0;
22
+ if (typeof value === "string") {
23
+ const normalized = value.trim().toLowerCase();
24
+ if (["1", "true", "yes", "on"].includes(normalized)) return true;
25
+ if (["0", "false", "no", "off"].includes(normalized)) return false;
26
+ }
27
+ return fallback;
28
+ }
29
+ function isMissingJsonValue(value) {
30
+ return value === null || value === void 0 || value === "";
31
+ }
32
+ function parseJsonValue(value, fallback) {
33
+ if (isMissingJsonValue(value)) return fallback;
34
+ if (typeof value !== "string") {
35
+ if (typeof value === "object") return value;
36
+ throw new Error(
37
+ `[GoalsSql] Expected JSON string or object, received ${typeof value}`
38
+ );
39
+ }
40
+ try {
41
+ return JSON.parse(value);
42
+ } catch (error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ throw new Error(`[GoalsSql] Invalid JSON value: ${message}`);
45
+ }
46
+ }
47
+ function parseJsonRecord(value) {
48
+ if (isMissingJsonValue(value)) return {};
49
+ const parsed = parseJsonValue(value, null);
50
+ const object = asObject(parsed);
51
+ if (object) return object;
52
+ throw new Error("[GoalsSql] Expected JSON object");
53
+ }
54
+ function parseJsonArray(value) {
55
+ if (isMissingJsonValue(value)) return [];
56
+ const parsed = parseJsonValue(value, null);
57
+ if (Array.isArray(parsed)) return parsed;
58
+ throw new Error("[GoalsSql] Expected JSON array");
59
+ }
60
+ function extractRows(result) {
61
+ if (Array.isArray(result)) {
62
+ return result.map((row) => asObject(row)).filter((row) => row !== null);
63
+ }
64
+ const object = asObject(result);
65
+ if (!object) return [];
66
+ const rows = object.rows;
67
+ if (!Array.isArray(rows)) return [];
68
+ return rows.map((row) => asObject(row)).filter((row) => row !== null);
69
+ }
70
+ async function getSqlRaw() {
71
+ if (cachedSqlRaw) return cachedSqlRaw;
72
+ const drizzle = await import("drizzle-orm");
73
+ cachedSqlRaw = drizzle.sql.raw;
74
+ return cachedSqlRaw;
75
+ }
76
+ function getRuntimeDb(runtime) {
77
+ const db = runtime.adapter.db;
78
+ if (!db || typeof db.execute !== "function") {
79
+ throw new Error("runtime database adapter unavailable");
80
+ }
81
+ return db;
82
+ }
83
+ async function executeRawSql(runtime, sqlText2) {
84
+ const raw = await getSqlRaw();
85
+ const db = getRuntimeDb(runtime);
86
+ const result = await db.execute(raw(sqlText2));
87
+ return extractRows(result);
88
+ }
89
+ function sqlQuote(value) {
90
+ return `'${value.replace(/'/g, "''")}'`;
91
+ }
92
+ function sqlText(value) {
93
+ if (value === null || value === void 0) return "NULL";
94
+ return sqlQuote(value);
95
+ }
96
+ function sqlInteger(value) {
97
+ if (value === null || value === void 0) return "NULL";
98
+ if (!Number.isFinite(value)) throw new Error("invalid numeric SQL literal");
99
+ return String(Math.trunc(value));
100
+ }
101
+ function sqlNumber(value) {
102
+ if (value === null || value === void 0) return "NULL";
103
+ if (!Number.isFinite(value)) throw new Error("invalid numeric SQL literal");
104
+ return String(value);
105
+ }
106
+ function sqlBoolean(value) {
107
+ return value ? "TRUE" : "FALSE";
108
+ }
109
+ function sqlJson(value) {
110
+ return sqlQuote(JSON.stringify(value ?? null));
111
+ }
112
+ export {
113
+ asObject,
114
+ executeRawSql,
115
+ extractRows,
116
+ getRuntimeDb,
117
+ parseJsonArray,
118
+ parseJsonRecord,
119
+ parseJsonValue,
120
+ sqlBoolean,
121
+ sqlInteger,
122
+ sqlJson,
123
+ sqlNumber,
124
+ sqlQuote,
125
+ sqlText,
126
+ toBoolean,
127
+ toNumber,
128
+ toText
129
+ };
130
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/db/sql.ts"],"sourcesContent":["import type { IAgentRuntime } from \"@elizaos/core\";\n\n/**\n * Self-contained raw-SQL helpers for the goals back-end. Copied verbatim from\n * the PA LifeOps sql helpers (renamed error prefixes) so this plugin carries no\n * dependency on `@elizaos/plugin-personal-assistant`. Keep in sync only when a\n * correctness fix applies to both; do not add goals-specific logic here.\n */\n\nexport type RawSqlQuery = {\n queryChunks: Array<{ value?: unknown }>;\n};\n\nexport type RuntimeDb = {\n execute: (query: RawSqlQuery) => Promise<unknown>;\n};\n\nlet cachedSqlRaw: ((query: string) => RawSqlQuery) | null = null;\n\nexport function asObject(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nexport function toText(value: unknown, fallback = \"\"): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return fallback;\n return String(value);\n}\n\nexport function toNumber(value: unknown, fallback = 0): number {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\nexport function toBoolean(value: unknown, fallback = false): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n }\n return fallback;\n}\n\nfunction isMissingJsonValue(value: unknown): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\nexport function parseJsonValue<T>(value: unknown, fallback: T): T {\n if (isMissingJsonValue(value)) return fallback;\n if (typeof value !== \"string\") {\n if (typeof value === \"object\") return value as T;\n throw new Error(\n `[GoalsSql] Expected JSON string or object, received ${typeof value}`,\n );\n }\n try {\n return JSON.parse(value) as T;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`[GoalsSql] Invalid JSON value: ${message}`);\n }\n}\n\nexport function parseJsonRecord(value: unknown): Record<string, unknown> {\n if (isMissingJsonValue(value)) return {};\n const parsed = parseJsonValue<Record<string, unknown> | null>(value, null);\n const object = asObject(parsed);\n if (object) return object;\n throw new Error(\"[GoalsSql] Expected JSON object\");\n}\n\nexport function parseJsonArray<T>(value: unknown): T[] {\n if (isMissingJsonValue(value)) return [];\n const parsed = parseJsonValue<T[] | null>(value, null);\n if (Array.isArray(parsed)) return parsed;\n throw new Error(\"[GoalsSql] Expected JSON array\");\n}\n\nexport function extractRows(result: unknown): Array<Record<string, unknown>> {\n if (Array.isArray(result)) {\n return result\n .map((row) => asObject(row))\n .filter((row): row is Record<string, unknown> => row !== null);\n }\n const object = asObject(result);\n if (!object) return [];\n const rows = object.rows;\n if (!Array.isArray(rows)) return [];\n return rows\n .map((row) => asObject(row))\n .filter((row): row is Record<string, unknown> => row !== null);\n}\n\nasync function getSqlRaw(): Promise<(query: string) => RawSqlQuery> {\n if (cachedSqlRaw) return cachedSqlRaw;\n const drizzle = (await import(\"drizzle-orm\")) as {\n sql: { raw: (query: string) => RawSqlQuery };\n };\n cachedSqlRaw = drizzle.sql.raw;\n return cachedSqlRaw;\n}\n\nexport function getRuntimeDb(runtime: IAgentRuntime): RuntimeDb {\n const db = runtime.adapter.db as RuntimeDb | undefined;\n if (!db || typeof db.execute !== \"function\") {\n throw new Error(\"runtime database adapter unavailable\");\n }\n return db;\n}\n\nexport async function executeRawSql(\n runtime: IAgentRuntime,\n sqlText: string,\n): Promise<Array<Record<string, unknown>>> {\n const raw = await getSqlRaw();\n const db = getRuntimeDb(runtime);\n const result = await db.execute(raw(sqlText));\n return extractRows(result);\n}\n\n// ---------------------------------------------------------------------------\n// SQL value encoders\n// ---------------------------------------------------------------------------\n\nexport function sqlQuote(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nexport function sqlText(value: string | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n return sqlQuote(value);\n}\n\nexport function sqlInteger(value: number | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n if (!Number.isFinite(value)) throw new Error(\"invalid numeric SQL literal\");\n return String(Math.trunc(value));\n}\n\nexport function sqlNumber(value: number | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n if (!Number.isFinite(value)) throw new Error(\"invalid numeric SQL literal\");\n return String(value);\n}\n\nexport function sqlBoolean(value: boolean): string {\n return value ? \"TRUE\" : \"FALSE\";\n}\n\nexport function sqlJson(value: unknown): string {\n return sqlQuote(JSON.stringify(value ?? null));\n}\n"],"mappings":"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","names":["sqlText"]}
@@ -0,0 +1,54 @@
1
+ import type { LifeOpsGoalReviewState } from "@elizaos/shared";
2
+ export declare const GOAL_GROUNDING_STATES: readonly ["grounded", "partial", "ungrounded"];
3
+ export type GoalGroundingState = (typeof GOAL_GROUNDING_STATES)[number];
4
+ export interface GoalGroundingMetadata {
5
+ version: 1;
6
+ groundingState: GoalGroundingState;
7
+ summary: string | null;
8
+ targetDomain: string | null;
9
+ groundedAt: string | null;
10
+ confidence: number | null;
11
+ missingCriticalFields: string[];
12
+ evidenceSignals: string[];
13
+ reviewCadenceKind: string | null;
14
+ }
15
+ export interface GoalSemanticSuggestionMetadata {
16
+ kind: string | null;
17
+ title: string;
18
+ detail: string;
19
+ }
20
+ export interface GoalSemanticReviewMetadata {
21
+ reviewedAt: string;
22
+ reviewState: LifeOpsGoalReviewState;
23
+ progressScore: number | null;
24
+ confidence: number | null;
25
+ explanation: string;
26
+ evidenceSummary: string | null;
27
+ missingEvidence: string[];
28
+ suggestions: GoalSemanticSuggestionMetadata[];
29
+ }
30
+ export declare function buildGoalGroundingMetadata(args: {
31
+ confidence?: number | null;
32
+ evidenceSignals?: string[];
33
+ groundedAt?: string | null;
34
+ groundingState: GoalGroundingState;
35
+ missingCriticalFields?: string[];
36
+ reviewCadenceKind?: string | null;
37
+ summary?: string | null;
38
+ targetDomain?: string | null;
39
+ }): GoalGroundingMetadata;
40
+ export declare function mergeGoalGroundingMetadata(metadata: Record<string, unknown>, grounding: GoalGroundingMetadata): Record<string, unknown>;
41
+ export declare function readGoalGroundingMetadata(value: unknown): GoalGroundingMetadata | null;
42
+ export declare function buildGoalSemanticReviewMetadata(args: {
43
+ confidence?: number | null;
44
+ evidenceSummary?: string | null;
45
+ explanation: string;
46
+ missingEvidence?: string[];
47
+ progressScore?: number | null;
48
+ reviewState: LifeOpsGoalReviewState;
49
+ reviewedAt: string;
50
+ suggestions?: GoalSemanticSuggestionMetadata[];
51
+ }): GoalSemanticReviewMetadata;
52
+ export declare function mergeGoalSemanticReviewMetadata(metadata: Record<string, unknown>, review: GoalSemanticReviewMetadata): Record<string, unknown>;
53
+ export declare function readGoalSemanticReviewMetadata(value: unknown): GoalSemanticReviewMetadata | null;
54
+ //# sourceMappingURL=goal-grounding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-grounding.d.ts","sourceRoot":"","sources":["../src/goal-grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,eAAO,MAAM,qBAAqB,gDAIxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,CAAC,CAAC;IACX,cAAc,EAAE,kBAAkB,CAAC;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,sBAAsB,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,8BAA8B,EAAE,CAAC;CAC/C;AAkCD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,kBAAkB,CAAC;IACnC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,qBAAqB,CAuBxB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,EAAE,qBAAqB,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,qBAAqB,GAAG,IAAI,CAuB9B;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,sBAAsB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,8BAA8B,EAAE,CAAC;CAChD,GAAG,0BAA0B,CA6B7B;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE,0BAA0B,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,0BAA0B,GAAG,IAAI,CA6CnC"}
@@ -0,0 +1,148 @@
1
+ import { LIFEOPS_REVIEW_STATES } from "@elizaos/shared";
2
+ const GOAL_GROUNDING_STATES = [
3
+ "grounded",
4
+ "partial",
5
+ "ungrounded"
6
+ ];
7
+ function asText(value) {
8
+ if (typeof value !== "string") {
9
+ return null;
10
+ }
11
+ const trimmed = value.trim();
12
+ return trimmed.length > 0 ? trimmed : null;
13
+ }
14
+ function asFiniteNumber(value) {
15
+ if (typeof value === "number" && Number.isFinite(value)) {
16
+ return value;
17
+ }
18
+ return null;
19
+ }
20
+ function asStringArray(value) {
21
+ if (!Array.isArray(value)) {
22
+ return [];
23
+ }
24
+ return value.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
25
+ }
26
+ function asRecord(value) {
27
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
28
+ return null;
29
+ }
30
+ return value;
31
+ }
32
+ function buildGoalGroundingMetadata(args) {
33
+ return {
34
+ version: 1,
35
+ groundingState: args.groundingState,
36
+ summary: args.summary ?? null,
37
+ targetDomain: args.targetDomain ?? null,
38
+ groundedAt: args.groundedAt ?? null,
39
+ confidence: typeof args.confidence === "number" && Number.isFinite(args.confidence) ? Math.max(0, Math.min(1, args.confidence)) : null,
40
+ missingCriticalFields: Array.from(
41
+ new Set((args.missingCriticalFields ?? []).filter(Boolean))
42
+ ),
43
+ evidenceSignals: Array.from(
44
+ new Set((args.evidenceSignals ?? []).filter(Boolean))
45
+ ),
46
+ reviewCadenceKind: typeof args.reviewCadenceKind === "string" && args.reviewCadenceKind.trim().length > 0 ? args.reviewCadenceKind.trim() : null
47
+ };
48
+ }
49
+ function mergeGoalGroundingMetadata(metadata, grounding) {
50
+ return {
51
+ ...metadata,
52
+ goalGrounding: grounding
53
+ };
54
+ }
55
+ function readGoalGroundingMetadata(value) {
56
+ const record = asRecord(value);
57
+ const candidate = asRecord(record?.goalGrounding ?? value);
58
+ if (!candidate) {
59
+ return null;
60
+ }
61
+ const groundingState = asText(candidate.groundingState);
62
+ if (!groundingState || !GOAL_GROUNDING_STATES.includes(groundingState)) {
63
+ return null;
64
+ }
65
+ return buildGoalGroundingMetadata({
66
+ confidence: asFiniteNumber(candidate.confidence),
67
+ evidenceSignals: asStringArray(candidate.evidenceSignals),
68
+ groundedAt: asText(candidate.groundedAt),
69
+ groundingState,
70
+ missingCriticalFields: asStringArray(candidate.missingCriticalFields),
71
+ reviewCadenceKind: asText(candidate.reviewCadenceKind),
72
+ summary: asText(candidate.summary),
73
+ targetDomain: asText(candidate.targetDomain)
74
+ });
75
+ }
76
+ function buildGoalSemanticReviewMetadata(args) {
77
+ return {
78
+ reviewedAt: args.reviewedAt,
79
+ reviewState: args.reviewState,
80
+ progressScore: typeof args.progressScore === "number" && Number.isFinite(args.progressScore) ? Math.max(0, Math.min(1, args.progressScore)) : null,
81
+ confidence: typeof args.confidence === "number" && Number.isFinite(args.confidence) ? Math.max(0, Math.min(1, args.confidence)) : null,
82
+ explanation: args.explanation.trim(),
83
+ evidenceSummary: args.evidenceSummary ?? null,
84
+ missingEvidence: Array.from(
85
+ new Set((args.missingEvidence ?? []).filter(Boolean))
86
+ ),
87
+ suggestions: (args.suggestions ?? []).map((suggestion) => ({
88
+ kind: asText(suggestion.kind),
89
+ title: suggestion.title.trim(),
90
+ detail: suggestion.detail.trim()
91
+ })).filter(
92
+ (suggestion) => suggestion.title.length > 0 && suggestion.detail.length > 0
93
+ )
94
+ };
95
+ }
96
+ function mergeGoalSemanticReviewMetadata(metadata, review) {
97
+ return {
98
+ ...metadata,
99
+ goalSemanticReview: review
100
+ };
101
+ }
102
+ function readGoalSemanticReviewMetadata(value) {
103
+ const record = asRecord(value);
104
+ const candidate = asRecord(record?.goalSemanticReview ?? value);
105
+ if (!candidate) {
106
+ return null;
107
+ }
108
+ const reviewedAt = asText(candidate.reviewedAt);
109
+ const reviewState = asText(candidate.reviewState);
110
+ const explanation = asText(candidate.explanation);
111
+ if (!reviewedAt || !reviewState || !LIFEOPS_REVIEW_STATES.includes(reviewState) || !explanation) {
112
+ return null;
113
+ }
114
+ return buildGoalSemanticReviewMetadata({
115
+ confidence: asFiniteNumber(candidate.confidence),
116
+ evidenceSummary: asText(candidate.evidenceSummary),
117
+ explanation,
118
+ missingEvidence: asStringArray(candidate.missingEvidence),
119
+ progressScore: asFiniteNumber(candidate.progressScore),
120
+ reviewState,
121
+ reviewedAt,
122
+ suggestions: Array.isArray(candidate.suggestions) ? candidate.suggestions.map((entry) => {
123
+ const suggestion = asRecord(entry);
124
+ const title = asText(suggestion?.title);
125
+ const detail = asText(suggestion?.detail);
126
+ if (!title || !detail) {
127
+ return null;
128
+ }
129
+ return {
130
+ kind: asText(suggestion?.kind),
131
+ title,
132
+ detail
133
+ };
134
+ }).filter(
135
+ (entry) => entry !== null
136
+ ) : []
137
+ });
138
+ }
139
+ export {
140
+ GOAL_GROUNDING_STATES,
141
+ buildGoalGroundingMetadata,
142
+ buildGoalSemanticReviewMetadata,
143
+ mergeGoalGroundingMetadata,
144
+ mergeGoalSemanticReviewMetadata,
145
+ readGoalGroundingMetadata,
146
+ readGoalSemanticReviewMetadata
147
+ };
148
+ //# sourceMappingURL=goal-grounding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/goal-grounding.ts"],"sourcesContent":["import type { LifeOpsGoalReviewState } from \"@elizaos/shared\";\nimport { LIFEOPS_REVIEW_STATES } from \"@elizaos/shared\";\n\nexport const GOAL_GROUNDING_STATES = [\n \"grounded\",\n \"partial\",\n \"ungrounded\",\n] as const;\n\nexport type GoalGroundingState = (typeof GOAL_GROUNDING_STATES)[number];\n\nexport interface GoalGroundingMetadata {\n version: 1;\n groundingState: GoalGroundingState;\n summary: string | null;\n targetDomain: string | null;\n groundedAt: string | null;\n confidence: number | null;\n missingCriticalFields: string[];\n evidenceSignals: string[];\n reviewCadenceKind: string | null;\n}\n\nexport interface GoalSemanticSuggestionMetadata {\n kind: string | null;\n title: string;\n detail: string;\n}\n\nexport interface GoalSemanticReviewMetadata {\n reviewedAt: string;\n reviewState: LifeOpsGoalReviewState;\n progressScore: number | null;\n confidence: number | null;\n explanation: string;\n evidenceSummary: string | null;\n missingEvidence: string[];\n suggestions: GoalSemanticSuggestionMetadata[];\n}\n\nfunction asText(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction asFiniteNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return null;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nexport function buildGoalGroundingMetadata(args: {\n confidence?: number | null;\n evidenceSignals?: string[];\n groundedAt?: string | null;\n groundingState: GoalGroundingState;\n missingCriticalFields?: string[];\n reviewCadenceKind?: string | null;\n summary?: string | null;\n targetDomain?: string | null;\n}): GoalGroundingMetadata {\n return {\n version: 1,\n groundingState: args.groundingState,\n summary: args.summary ?? null,\n targetDomain: args.targetDomain ?? null,\n groundedAt: args.groundedAt ?? null,\n confidence:\n typeof args.confidence === \"number\" && Number.isFinite(args.confidence)\n ? Math.max(0, Math.min(1, args.confidence))\n : null,\n missingCriticalFields: Array.from(\n new Set((args.missingCriticalFields ?? []).filter(Boolean)),\n ),\n evidenceSignals: Array.from(\n new Set((args.evidenceSignals ?? []).filter(Boolean)),\n ),\n reviewCadenceKind:\n typeof args.reviewCadenceKind === \"string\" &&\n args.reviewCadenceKind.trim().length > 0\n ? args.reviewCadenceKind.trim()\n : null,\n };\n}\n\nexport function mergeGoalGroundingMetadata(\n metadata: Record<string, unknown>,\n grounding: GoalGroundingMetadata,\n): Record<string, unknown> {\n return {\n ...metadata,\n goalGrounding: grounding,\n };\n}\n\nexport function readGoalGroundingMetadata(\n value: unknown,\n): GoalGroundingMetadata | null {\n const record = asRecord(value);\n const candidate = asRecord(record?.goalGrounding ?? value);\n if (!candidate) {\n return null;\n }\n const groundingState = asText(candidate.groundingState);\n if (\n !groundingState ||\n !GOAL_GROUNDING_STATES.includes(groundingState as GoalGroundingState)\n ) {\n return null;\n }\n return buildGoalGroundingMetadata({\n confidence: asFiniteNumber(candidate.confidence),\n evidenceSignals: asStringArray(candidate.evidenceSignals),\n groundedAt: asText(candidate.groundedAt),\n groundingState: groundingState as GoalGroundingState,\n missingCriticalFields: asStringArray(candidate.missingCriticalFields),\n reviewCadenceKind: asText(candidate.reviewCadenceKind),\n summary: asText(candidate.summary),\n targetDomain: asText(candidate.targetDomain),\n });\n}\n\nexport function buildGoalSemanticReviewMetadata(args: {\n confidence?: number | null;\n evidenceSummary?: string | null;\n explanation: string;\n missingEvidence?: string[];\n progressScore?: number | null;\n reviewState: LifeOpsGoalReviewState;\n reviewedAt: string;\n suggestions?: GoalSemanticSuggestionMetadata[];\n}): GoalSemanticReviewMetadata {\n return {\n reviewedAt: args.reviewedAt,\n reviewState: args.reviewState,\n progressScore:\n typeof args.progressScore === \"number\" &&\n Number.isFinite(args.progressScore)\n ? Math.max(0, Math.min(1, args.progressScore))\n : null,\n confidence:\n typeof args.confidence === \"number\" && Number.isFinite(args.confidence)\n ? Math.max(0, Math.min(1, args.confidence))\n : null,\n explanation: args.explanation.trim(),\n evidenceSummary: args.evidenceSummary ?? null,\n missingEvidence: Array.from(\n new Set((args.missingEvidence ?? []).filter(Boolean)),\n ),\n suggestions: (args.suggestions ?? [])\n .map((suggestion) => ({\n kind: asText(suggestion.kind),\n title: suggestion.title.trim(),\n detail: suggestion.detail.trim(),\n }))\n .filter(\n (suggestion) =>\n suggestion.title.length > 0 && suggestion.detail.length > 0,\n ),\n };\n}\n\nexport function mergeGoalSemanticReviewMetadata(\n metadata: Record<string, unknown>,\n review: GoalSemanticReviewMetadata,\n): Record<string, unknown> {\n return {\n ...metadata,\n goalSemanticReview: review,\n };\n}\n\nexport function readGoalSemanticReviewMetadata(\n value: unknown,\n): GoalSemanticReviewMetadata | null {\n const record = asRecord(value);\n const candidate = asRecord(record?.goalSemanticReview ?? value);\n if (!candidate) {\n return null;\n }\n const reviewedAt = asText(candidate.reviewedAt);\n const reviewState = asText(candidate.reviewState);\n const explanation = asText(candidate.explanation);\n if (\n !reviewedAt ||\n !reviewState ||\n !LIFEOPS_REVIEW_STATES.includes(reviewState as LifeOpsGoalReviewState) ||\n !explanation\n ) {\n return null;\n }\n return buildGoalSemanticReviewMetadata({\n confidence: asFiniteNumber(candidate.confidence),\n evidenceSummary: asText(candidate.evidenceSummary),\n explanation,\n missingEvidence: asStringArray(candidate.missingEvidence),\n progressScore: asFiniteNumber(candidate.progressScore),\n reviewState: reviewState as LifeOpsGoalReviewState,\n reviewedAt,\n suggestions: Array.isArray(candidate.suggestions)\n ? candidate.suggestions\n .map((entry) => {\n const suggestion = asRecord(entry);\n const title = asText(suggestion?.title);\n const detail = asText(suggestion?.detail);\n if (!title || !detail) {\n return null;\n }\n return {\n kind: asText(suggestion?.kind),\n title,\n detail,\n };\n })\n .filter(\n (entry): entry is GoalSemanticSuggestionMetadata => entry !== null,\n )\n : [],\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Self-contained input-normalization helpers for the goals back-end.
3
+ *
4
+ * These mirror the small subset of `@elizaos/plugin-personal-assistant`'s
5
+ * `service-normalize` / `service-helpers-misc` helpers that the goal CRUD code
6
+ * actually used. They are reproduced here (rather than imported) so
7
+ * `@elizaos/plugin-goals` carries no dependency on plugin-personal-assistant.
8
+ * `fail` throws a {@link GoalsServiceError} carrying an HTTP status, which the
9
+ * action and route layers map to client-facing responses.
10
+ */
11
+ import type { IAgentRuntime } from "@elizaos/core";
12
+ /** Error carrying an HTTP status for goals back-end failures. */
13
+ export declare class GoalsServiceError extends Error {
14
+ readonly status: number;
15
+ readonly code?: string | undefined;
16
+ constructor(status: number, message: string, code?: string | undefined);
17
+ }
18
+ export declare function goalsErrorMessage(error: unknown): string;
19
+ export declare function fail(status: number, message: string, code?: string): never;
20
+ export declare function requireAgentId(runtime: IAgentRuntime): string;
21
+ export declare function requireNonEmptyString(value: unknown, field: string): string;
22
+ export declare function normalizeOptionalString(value: unknown): string | undefined;
23
+ export declare function normalizeEnumValue<T extends string>(value: unknown, field: string, allowed: readonly T[], fallback?: T): T;
24
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
25
+ export declare function cloneRecord(value: unknown): Record<string, unknown>;
26
+ export declare function requireRecord(value: unknown, field: string): Record<string, unknown>;
27
+ export declare function normalizeOptionalRecord(value: unknown, field: string): Record<string, unknown> | undefined;
28
+ export declare function normalizeNullableRecord(value: unknown, field: string): Record<string, unknown> | null | undefined;
29
+ export declare function mergeMetadata(current: Record<string, unknown>, updates?: Record<string, unknown>): Record<string, unknown>;
30
+ //# sourceMappingURL=goal-normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-normalize.d.ts","sourceRoot":"","sources":["../src/goal-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,iEAAiE;AACjE,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,MAAM,EAAE,MAAM;aAEd,IAAI,CAAC,EAAE,MAAM;gBAFb,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAE1E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAM7D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS3E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI1E;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,QAAQ,CAAC,EAAE,CAAC,GACX,CAAC,CAYH;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGnE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAGrC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,CAI5C;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB"}
@@ -0,0 +1,99 @@
1
+ class GoalsServiceError extends Error {
2
+ constructor(status, message, code) {
3
+ super(message);
4
+ this.status = status;
5
+ this.code = code;
6
+ this.name = "GoalsServiceError";
7
+ }
8
+ status;
9
+ code;
10
+ }
11
+ function goalsErrorMessage(error) {
12
+ return error instanceof Error ? error.message : String(error);
13
+ }
14
+ function fail(status, message, code) {
15
+ throw new GoalsServiceError(status, message, code);
16
+ }
17
+ function requireAgentId(runtime) {
18
+ const agentId = runtime.agentId;
19
+ if (typeof agentId !== "string" || agentId.trim().length === 0) {
20
+ fail(500, "agent runtime is missing agentId");
21
+ }
22
+ return agentId;
23
+ }
24
+ function requireNonEmptyString(value, field) {
25
+ if (typeof value !== "string") {
26
+ fail(400, `${field} must be a string`);
27
+ }
28
+ const normalized = value.trim();
29
+ if (normalized.length === 0) {
30
+ fail(400, `${field} is required`);
31
+ }
32
+ return normalized;
33
+ }
34
+ function normalizeOptionalString(value) {
35
+ if (typeof value !== "string") return void 0;
36
+ const normalized = value.trim();
37
+ return normalized.length > 0 ? normalized : void 0;
38
+ }
39
+ function normalizeEnumValue(value, field, allowed, fallback) {
40
+ if (fallback !== void 0 && (value === void 0 || value === null || value === "")) {
41
+ return fallback;
42
+ }
43
+ const text = requireNonEmptyString(value, field);
44
+ if (!allowed.includes(text)) {
45
+ fail(400, `${field} must be one of: ${allowed.join(", ")}`);
46
+ }
47
+ return text;
48
+ }
49
+ function isRecord(value) {
50
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
51
+ }
52
+ function cloneRecord(value) {
53
+ if (!isRecord(value)) return {};
54
+ return { ...value };
55
+ }
56
+ function requireRecord(value, field) {
57
+ if (!isRecord(value)) {
58
+ fail(400, `${field} must be an object`);
59
+ }
60
+ return { ...value };
61
+ }
62
+ function normalizeOptionalRecord(value, field) {
63
+ if (value === void 0) return void 0;
64
+ return requireRecord(value, field);
65
+ }
66
+ function normalizeNullableRecord(value, field) {
67
+ if (value === void 0) return void 0;
68
+ if (value === null) return null;
69
+ return requireRecord(value, field);
70
+ }
71
+ function mergeMetadata(current, updates) {
72
+ const merged = {
73
+ ...current,
74
+ ...cloneRecord(updates)
75
+ };
76
+ if (typeof merged.privacyClass !== "string" || merged.privacyClass.trim().length === 0) {
77
+ merged.privacyClass = "private";
78
+ }
79
+ if (merged.privacyClass === "private") {
80
+ merged.publicContextBlocked = true;
81
+ }
82
+ return merged;
83
+ }
84
+ export {
85
+ GoalsServiceError,
86
+ cloneRecord,
87
+ fail,
88
+ goalsErrorMessage,
89
+ isRecord,
90
+ mergeMetadata,
91
+ normalizeEnumValue,
92
+ normalizeNullableRecord,
93
+ normalizeOptionalRecord,
94
+ normalizeOptionalString,
95
+ requireAgentId,
96
+ requireNonEmptyString,
97
+ requireRecord
98
+ };
99
+ //# sourceMappingURL=goal-normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/goal-normalize.ts"],"sourcesContent":["/**\n * Self-contained input-normalization helpers for the goals back-end.\n *\n * These mirror the small subset of `@elizaos/plugin-personal-assistant`'s\n * `service-normalize` / `service-helpers-misc` helpers that the goal CRUD code\n * actually used. They are reproduced here (rather than imported) so\n * `@elizaos/plugin-goals` carries no dependency on plugin-personal-assistant.\n * `fail` throws a {@link GoalsServiceError} carrying an HTTP status, which the\n * action and route layers map to client-facing responses.\n */\n\nimport type { IAgentRuntime } from \"@elizaos/core\";\n\n/** Error carrying an HTTP status for goals back-end failures. */\nexport class GoalsServiceError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"GoalsServiceError\";\n }\n}\n\nexport function goalsErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function fail(status: number, message: string, code?: string): never {\n throw new GoalsServiceError(status, message, code);\n}\n\nexport function requireAgentId(runtime: IAgentRuntime): string {\n const agentId = runtime.agentId;\n if (typeof agentId !== \"string\" || agentId.trim().length === 0) {\n fail(500, \"agent runtime is missing agentId\");\n }\n return agentId;\n}\n\nexport function requireNonEmptyString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n fail(400, `${field} must be a string`);\n }\n const normalized = value.trim();\n if (normalized.length === 0) {\n fail(400, `${field} is required`);\n }\n return normalized;\n}\n\nexport function normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEnumValue<T extends string>(\n value: unknown,\n field: string,\n allowed: readonly T[],\n fallback?: T,\n): T {\n if (\n fallback !== undefined &&\n (value === undefined || value === null || value === \"\")\n ) {\n return fallback;\n }\n const text = requireNonEmptyString(value, field) as T;\n if (!allowed.includes(text)) {\n fail(400, `${field} must be one of: ${allowed.join(\", \")}`);\n }\n return text;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function cloneRecord(value: unknown): Record<string, unknown> {\n if (!isRecord(value)) return {};\n return { ...value };\n}\n\nexport function requireRecord(\n value: unknown,\n field: string,\n): Record<string, unknown> {\n if (!isRecord(value)) {\n fail(400, `${field} must be an object`);\n }\n return { ...value };\n}\n\nexport function normalizeOptionalRecord(\n value: unknown,\n field: string,\n): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n return requireRecord(value, field);\n}\n\nexport function normalizeNullableRecord(\n value: unknown,\n field: string,\n): Record<string, unknown> | null | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n return requireRecord(value, field);\n}\n\nexport function mergeMetadata(\n current: Record<string, unknown>,\n updates?: Record<string, unknown>,\n): Record<string, unknown> {\n const merged = {\n ...current,\n ...cloneRecord(updates),\n };\n if (\n typeof merged.privacyClass !== \"string\" ||\n merged.privacyClass.trim().length === 0\n ) {\n merged.privacyClass = \"private\";\n }\n if (merged.privacyClass === \"private\") {\n merged.publicContextBlocked = true;\n }\n return merged;\n}\n"],"mappings":"AAcO,MAAM,0BAA0B,MAAM;AAAA,EAC3C,YACkB,QAChB,SACgB,MAChB;AACA,UAAM,OAAO;AAJG;AAEA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EANkB;AAAA,EAEA;AAKpB;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEO,SAAS,KAAK,QAAgB,SAAiB,MAAsB;AAC1E,QAAM,IAAI,kBAAkB,QAAQ,SAAS,IAAI;AACnD;AAEO,SAAS,eAAe,SAAgC;AAC7D,QAAM,UAAU,QAAQ;AACxB,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC9D,SAAK,KAAK,kCAAkC;AAAA,EAC9C;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAgB,OAAuB;AAC3E,MAAI,OAAO,UAAU,UAAU;AAC7B,SAAK,KAAK,GAAG,KAAK,mBAAmB;AAAA,EACvC;AACA,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,WAAW,WAAW,GAAG;AAC3B,SAAK,KAAK,GAAG,KAAK,cAAc;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,OAAoC;AAC1E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEO,SAAS,mBACd,OACA,OACA,SACA,UACG;AACH,MACE,aAAa,WACZ,UAAU,UAAa,UAAU,QAAQ,UAAU,KACpD;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAO,sBAAsB,OAAO,KAAK;AAC/C,MAAI,CAAC,QAAQ,SAAS,IAAI,GAAG;AAC3B,SAAK,KAAK,GAAG,KAAK,oBAAoB,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,SAAS,SAAS,OAAkD;AACzE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,YAAY,OAAyC;AACnE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO,CAAC;AAC9B,SAAO,EAAE,GAAG,MAAM;AACpB;AAEO,SAAS,cACd,OACA,OACyB;AACzB,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,SAAK,KAAK,GAAG,KAAK,oBAAoB;AAAA,EACxC;AACA,SAAO,EAAE,GAAG,MAAM;AACpB;AAEO,SAAS,wBACd,OACA,OACqC;AACrC,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,cAAc,OAAO,KAAK;AACnC;AAEO,SAAS,wBACd,OACA,OAC4C;AAC5C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,cAAc,OAAO,KAAK;AACnC;AAEO,SAAS,cACd,SACA,SACyB;AACzB,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,GAAG,YAAY,OAAO;AAAA,EACxB;AACA,MACE,OAAO,OAAO,iBAAiB,YAC/B,OAAO,aAAa,KAAK,EAAE,WAAW,GACtC;AACA,WAAO,eAAe;AAAA,EACxB;AACA,MAAI,OAAO,iBAAiB,WAAW;AACrC,WAAO,uBAAuB;AAAA,EAChC;AACA,SAAO;AACT;","names":[]}