@lobu/cli 6.1.1 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/commands/_lib/apply/apply-cmd.d.ts +36 -0
  2. package/dist/commands/_lib/apply/apply-cmd.d.ts.map +1 -1
  3. package/dist/commands/_lib/apply/apply-cmd.js +696 -40
  4. package/dist/commands/_lib/apply/apply-cmd.js.map +1 -1
  5. package/dist/commands/_lib/apply/client.d.ts +285 -0
  6. package/dist/commands/_lib/apply/client.d.ts.map +1 -1
  7. package/dist/commands/_lib/apply/client.js +469 -28
  8. package/dist/commands/_lib/apply/client.js.map +1 -1
  9. package/dist/commands/_lib/apply/desired-state.d.ts +187 -3
  10. package/dist/commands/_lib/apply/desired-state.d.ts.map +1 -1
  11. package/dist/commands/_lib/apply/desired-state.js +879 -88
  12. package/dist/commands/_lib/apply/desired-state.js.map +1 -1
  13. package/dist/commands/_lib/apply/diff.d.ts +72 -3
  14. package/dist/commands/_lib/apply/diff.d.ts.map +1 -1
  15. package/dist/commands/_lib/apply/diff.js +473 -84
  16. package/dist/commands/_lib/apply/diff.js.map +1 -1
  17. package/dist/commands/_lib/apply/prompt.d.ts +6 -0
  18. package/dist/commands/_lib/apply/prompt.d.ts.map +1 -1
  19. package/dist/commands/_lib/apply/prompt.js +16 -0
  20. package/dist/commands/_lib/apply/prompt.js.map +1 -1
  21. package/dist/commands/_lib/apply/render.d.ts +9 -0
  22. package/dist/commands/_lib/apply/render.d.ts.map +1 -1
  23. package/dist/commands/_lib/apply/render.js +80 -3
  24. package/dist/commands/_lib/apply/render.js.map +1 -1
  25. package/dist/commands/_lib/connector-loader.d.ts +3 -0
  26. package/dist/commands/_lib/connector-loader.d.ts.map +1 -0
  27. package/dist/commands/_lib/connector-loader.js +129 -0
  28. package/dist/commands/_lib/connector-loader.js.map +1 -0
  29. package/dist/commands/_lib/connector-run-cmd.d.ts +35 -0
  30. package/dist/commands/_lib/connector-run-cmd.d.ts.map +1 -0
  31. package/dist/commands/_lib/connector-run-cmd.js +351 -0
  32. package/dist/commands/_lib/connector-run-cmd.js.map +1 -0
  33. package/dist/commands/_lib/export/export-cmd.d.ts +35 -0
  34. package/dist/commands/_lib/export/export-cmd.d.ts.map +1 -0
  35. package/dist/commands/_lib/export/export-cmd.js +329 -0
  36. package/dist/commands/_lib/export/export-cmd.js.map +1 -0
  37. package/dist/commands/agent.d.ts.map +1 -1
  38. package/dist/commands/agent.js +11 -14
  39. package/dist/commands/agent.js.map +1 -1
  40. package/dist/commands/chat.d.ts.map +1 -1
  41. package/dist/commands/chat.js +28 -7
  42. package/dist/commands/chat.js.map +1 -1
  43. package/dist/commands/connector.d.ts +3 -0
  44. package/dist/commands/connector.d.ts.map +1 -0
  45. package/dist/commands/connector.js +5 -0
  46. package/dist/commands/connector.js.map +1 -0
  47. package/dist/commands/dev.d.ts +23 -0
  48. package/dist/commands/dev.d.ts.map +1 -1
  49. package/dist/commands/dev.js +273 -8
  50. package/dist/commands/dev.js.map +1 -1
  51. package/dist/commands/doctor.d.ts.map +1 -1
  52. package/dist/commands/doctor.js +2 -3
  53. package/dist/commands/doctor.js.map +1 -1
  54. package/dist/commands/eval.d.ts.map +1 -1
  55. package/dist/commands/eval.js +28 -18
  56. package/dist/commands/eval.js.map +1 -1
  57. package/dist/commands/init.d.ts +2 -0
  58. package/dist/commands/init.d.ts.map +1 -1
  59. package/dist/commands/init.js +29 -1
  60. package/dist/commands/init.js.map +1 -1
  61. package/dist/commands/login.d.ts.map +1 -1
  62. package/dist/commands/login.js +22 -16
  63. package/dist/commands/login.js.map +1 -1
  64. package/dist/commands/memory/_lib/browser-auth-cmd.d.ts.map +1 -1
  65. package/dist/commands/memory/_lib/browser-auth-cmd.js +15 -144
  66. package/dist/commands/memory/_lib/browser-auth-cmd.js.map +1 -1
  67. package/dist/commands/memory/_lib/schema.d.ts +28 -1
  68. package/dist/commands/memory/_lib/schema.d.ts.map +1 -1
  69. package/dist/commands/memory/_lib/schema.js +120 -4
  70. package/dist/commands/memory/_lib/schema.js.map +1 -1
  71. package/dist/commands/memory/_lib/seed-cmd.d.ts.map +1 -1
  72. package/dist/commands/memory/_lib/seed-cmd.js +41 -18
  73. package/dist/commands/memory/_lib/seed-cmd.js.map +1 -1
  74. package/dist/commands/org.d.ts +4 -0
  75. package/dist/commands/org.d.ts.map +1 -1
  76. package/dist/commands/org.js +10 -0
  77. package/dist/commands/org.js.map +1 -1
  78. package/dist/commands/token.d.ts +9 -0
  79. package/dist/commands/token.d.ts.map +1 -1
  80. package/dist/commands/token.js +54 -3
  81. package/dist/commands/token.js.map +1 -1
  82. package/dist/commands/validate.d.ts.map +1 -1
  83. package/dist/commands/validate.js +4 -13
  84. package/dist/commands/validate.js.map +1 -1
  85. package/dist/config/loader.js +2 -2
  86. package/dist/config/loader.js.map +1 -1
  87. package/dist/connectors/README.md +2 -3
  88. package/dist/connectors/apple_health.ts +138 -0
  89. package/dist/connectors/apple_photos.ts +178 -0
  90. package/dist/connectors/apple_screen_time.ts +82 -0
  91. package/dist/connectors/browser/evaluate.ts +120 -0
  92. package/dist/connectors/browser/fill_form.ts +107 -0
  93. package/dist/connectors/browser/page_text.ts +108 -0
  94. package/dist/connectors/browser-scraper-utils.ts +111 -3
  95. package/dist/connectors/capterra.ts +5 -1
  96. package/dist/connectors/chrome_tabs.ts +74 -0
  97. package/dist/connectors/g2.ts +5 -1
  98. package/dist/connectors/github.ts +16 -38
  99. package/dist/connectors/glassdoor.ts +5 -1
  100. package/dist/connectors/google_calendar.ts +28 -6
  101. package/dist/connectors/google_gmail.ts +6 -3
  102. package/dist/connectors/google_play.ts +32 -5
  103. package/dist/connectors/hackernews.ts +37 -2
  104. package/dist/connectors/index.ts +14 -1
  105. package/dist/connectors/linkedin.ts +32 -9
  106. package/dist/connectors/local_directory.ts +91 -0
  107. package/dist/connectors/reddit.ts +1 -0
  108. package/dist/connectors/revolut.ts +569 -0
  109. package/dist/connectors/rss.ts +33 -8
  110. package/dist/connectors/trustpilot.ts +36 -21
  111. package/dist/connectors/website.ts +8 -69
  112. package/dist/connectors/whatsapp.ts +21 -22
  113. package/dist/connectors/whatsapp_local.ts +125 -0
  114. package/dist/connectors/x.ts +17 -7
  115. package/dist/db/migrations/20260510220000_connector_required_capability.sql +47 -0
  116. package/dist/db/migrations/20260512000000_device_worker_connection_binding.sql +113 -0
  117. package/dist/db/migrations/20260512131703_connections_slug.sql +131 -0
  118. package/dist/db/migrations/20260513000000_chat_user_identities.sql +24 -0
  119. package/dist/db/migrations/20260513120000_auth_profiles_device_binding.sql +50 -0
  120. package/dist/db/migrations/20260513150000_auth_profiles_cdp_url.sql +43 -0
  121. package/dist/db/migrations/20260513200000_notifications_as_events.sql +86 -0
  122. package/dist/db/migrations/20260514000000_scheduled_jobs.sql +97 -0
  123. package/dist/db/migrations/20260514120000_auth_profiles_connector_key_nullable.sql +42 -0
  124. package/dist/db/migrations/20260514130000_connection_action_modes.sql +103 -0
  125. package/dist/db/migrations/20260514160000_auth_profiles_mirror_mode.sql +32 -0
  126. package/dist/db/migrations/20260515120000_agents_per_org_pk.sql +66 -0
  127. package/dist/db/migrations/20260515150000_geo_enrichment.sql +208 -0
  128. package/dist/db/migrations/20260515160000_drop_agents_org_id_unique.sql +24 -0
  129. package/dist/db/migrations/20260515170000_auth_profiles_default_for_connector.sql +23 -0
  130. package/dist/db/migrations/20260516120000_agents_per_org_pk_swap.sql +125 -0
  131. package/dist/db/migrations/20260516200000_events_search_tsv.sql +134 -0
  132. package/dist/db/migrations/20260516200100_events_lifecycle_changes_index.sql +25 -0
  133. package/dist/db/migrations/20260517010000_drop_unused_indexes.sql +49 -0
  134. package/dist/db/migrations/20260517020000_softdelete_orphan_feeds.sql +56 -0
  135. package/dist/db/migrations/20260517030000_pat_worker_id_binding.sql +27 -0
  136. package/dist/db/migrations/20260517040000_archive_orphan_watchers.sql +30 -0
  137. package/dist/db/migrations/20260517050000_watcher_agent_id_not_null.sql +34 -0
  138. package/dist/db/migrations/20260517060000_watcher_schema_additions.sql +78 -0
  139. package/dist/db/migrations/20260517150000_goals_primitive.sql +55 -0
  140. package/dist/db/migrations/20260517160000_drop_goals_primitive.sql +45 -0
  141. package/dist/db/migrations/20260518000000_pending_interactions.sql +49 -0
  142. package/dist/db/migrations/20260518010000_runs_heartbeat_reaper_index.sql +22 -0
  143. package/dist/eval/client.d.ts.map +1 -1
  144. package/dist/eval/client.js +11 -0
  145. package/dist/eval/client.js.map +1 -1
  146. package/dist/eval/grader.js +2 -1
  147. package/dist/eval/grader.js.map +1 -1
  148. package/dist/eval/types.d.ts +2 -0
  149. package/dist/eval/types.d.ts.map +1 -1
  150. package/dist/index.d.ts +11 -0
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +115 -114
  153. package/dist/index.js.map +1 -1
  154. package/dist/internal/context.d.ts +9 -0
  155. package/dist/internal/context.d.ts.map +1 -1
  156. package/dist/internal/context.js +41 -6
  157. package/dist/internal/context.js.map +1 -1
  158. package/dist/internal/credentials.d.ts +5 -0
  159. package/dist/internal/credentials.d.ts.map +1 -1
  160. package/dist/internal/credentials.js +75 -1
  161. package/dist/internal/credentials.js.map +1 -1
  162. package/dist/internal/gateway-url.d.ts +14 -0
  163. package/dist/internal/gateway-url.d.ts.map +1 -1
  164. package/dist/internal/gateway-url.js +19 -0
  165. package/dist/internal/gateway-url.js.map +1 -1
  166. package/dist/internal/index.d.ts +1 -1
  167. package/dist/internal/index.d.ts.map +1 -1
  168. package/dist/internal/index.js +1 -1
  169. package/dist/internal/index.js.map +1 -1
  170. package/dist/internal/local-env.d.ts.map +1 -1
  171. package/dist/internal/local-env.js +9 -2
  172. package/dist/internal/local-env.js.map +1 -1
  173. package/dist/server.bundle.mjs +42251 -36931
  174. package/dist/start-local.bundle.mjs +16437 -9882
  175. package/dist/templates/TESTING.md.tmpl +9 -9
  176. package/package.json +8 -6
  177. package/dist/connectors/google_photos.ts +0 -776
@@ -0,0 +1,27 @@
1
+ -- migrate:up
2
+
3
+ -- Bind PATs minted via /api/me/devices/mint-child-token to a specific
4
+ -- worker_id. Without this, a chrome-extension child PAT could post any
5
+ -- worker_id at /api/workers/poll and register a new device_workers row
6
+ -- under a different platform, bypassing the gateway's capability
7
+ -- authorization. The poll handler now refuses a request whose body's
8
+ -- `worker_id` doesn't match the PAT's bound `worker_id` (when non-NULL).
9
+ --
10
+ -- Legacy PATs (CLI tokens, OAuth-issued bearers via dynamic client
11
+ -- registration on the Mac/iOS bridges) keep worker_id = NULL; the poll
12
+ -- handler treats NULL as "no binding" and lets the body's value pass.
13
+
14
+ ALTER TABLE public.personal_access_tokens
15
+ ADD COLUMN IF NOT EXISTS worker_id text;
16
+
17
+ CREATE INDEX IF NOT EXISTS idx_personal_access_tokens_worker_id
18
+ ON public.personal_access_tokens (worker_id)
19
+ WHERE worker_id IS NOT NULL;
20
+
21
+ COMMENT ON COLUMN public.personal_access_tokens.worker_id IS
22
+ 'Optional binding to a specific device_workers.worker_id. Set by /api/me/devices/mint-child-token. When non-NULL, /api/workers/poll requires the request body''s worker_id to match.';
23
+
24
+ -- migrate:down
25
+
26
+ DROP INDEX IF EXISTS public.idx_personal_access_tokens_worker_id;
27
+ ALTER TABLE public.personal_access_tokens DROP COLUMN IF EXISTS worker_id;
@@ -0,0 +1,30 @@
1
+ -- migrate:up
2
+
3
+ -- Archive watchers that are flagged `status = 'active'` but have no `agent_id`.
4
+ -- The scheduler (packages/server/src/watchers/automation.ts:469) already
5
+ -- filters them out with `WHERE w.agent_id IS NOT NULL`, so these rows are
6
+ -- zombies — visible in the API, redirect-bounced on the watcher detail
7
+ -- route, never actually executing.
8
+ --
9
+ -- 2026-05-17 prod audit: 28 active orphans across 11 orgs (most originated
10
+ -- from older create paths before `agent_id` was wired in). Archiving them
11
+ -- aligns the stored status with their actual execution state and lets the
12
+ -- `/$owner/watchers/$watcherId` redirect logic stop silently sending users
13
+ -- to /agents.
14
+ --
15
+ -- The write-time guard (this same PR, manage_watchers.ts) rejects new
16
+ -- watcher creates/updates that set a schedule without an agent, so the
17
+ -- orphan set can't grow again.
18
+
19
+ UPDATE public.watchers
20
+ SET status = 'archived',
21
+ updated_at = now()
22
+ WHERE status = 'active'
23
+ AND agent_id IS NULL;
24
+
25
+ -- migrate:down
26
+
27
+ -- No-op: this is a one-shot data cleanup. The original rows can be restored
28
+ -- manually if needed by assigning an agent_id and flipping status back to
29
+ -- 'active'; without an agent, status='active' is meaningless to the
30
+ -- scheduler.
@@ -0,0 +1,34 @@
1
+ -- migrate:up
2
+
3
+ -- Delete every watcher with `agent_id IS NULL` and enforce the column at
4
+ -- the schema level. These rows are leftovers from before the watcher
5
+ -- scheduler required `agent_id` (see watchers/automation.ts:469) — they
6
+ -- couldn't fire and the prior migration 20260517040000 had already
7
+ -- archived the active subset. Their dependent rows (windows, reactions,
8
+ -- versions, classifiers, field feedback) describe runtime state for
9
+ -- watchers that will never execute; ON DELETE CASCADE clears them.
10
+ -- `runs.watcher_id` is ON DELETE SET NULL, so the 21k historical run
11
+ -- records remain — they just lose the watcher linkage.
12
+ --
13
+ -- Application-level guards in manage_watchers.ts (handleCreate +
14
+ -- handleCreateFromVersion) reject new inserts without `agent_id`; the
15
+ -- NOT NULL constraint below is the matching DB-level enforcement so
16
+ -- bypass paths can't reintroduce the zombie state.
17
+
18
+ DELETE FROM public.watchers WHERE agent_id IS NULL;
19
+
20
+ ALTER TABLE public.watchers
21
+ ALTER COLUMN agent_id SET NOT NULL;
22
+
23
+ -- The existing index is partial (`WHERE agent_id IS NOT NULL`), which is
24
+ -- a tautology once the column is NOT NULL. Replace it with an unconditional
25
+ -- index so explain plans don't show the dead predicate.
26
+ DROP INDEX IF EXISTS public.idx_watchers_agent_id;
27
+ CREATE INDEX idx_watchers_agent_id ON public.watchers USING btree (agent_id);
28
+
29
+ -- migrate:down
30
+
31
+ ALTER TABLE public.watchers
32
+ ALTER COLUMN agent_id DROP NOT NULL;
33
+
34
+ -- No restoring deleted rows — this is forward-only data cleanup.
@@ -0,0 +1,78 @@
1
+ -- migrate:up
2
+
3
+ -- Adds the columns needed by the device-aware watcher dispatcher (see
4
+ -- lobu-ai/lobu#798 / #799):
5
+ --
6
+ -- * device_worker_id — pin a watcher to a specific device worker
7
+ -- (when its inputs live on that device).
8
+ -- * agent_kind — overrides the owning agent's default kind for
9
+ -- this watcher (e.g. "background", "notifier").
10
+ -- * notification_channel — where firings surface: canvas, OS notification,
11
+ -- or both.
12
+ -- * notification_priority — priority class used by the dispatcher's
13
+ -- interrupt budget.
14
+ -- * min_cooldown_seconds — minimum seconds between two firings of the
15
+ -- same watcher (0 = no cooldown).
16
+ -- * last_fired_at — last time this watcher actually dispatched
17
+ -- a notification/canvas item.
18
+ --
19
+ -- Also adds device_workers.notification_budget_per_day for the per-device
20
+ -- global interrupt budget. 10/day is a placeholder default; tune later.
21
+
22
+ ALTER TABLE public.watchers
23
+ ADD COLUMN device_worker_id uuid REFERENCES public.device_workers(id),
24
+ ADD COLUMN agent_kind text,
25
+ ADD COLUMN notification_channel text NOT NULL DEFAULT 'canvas',
26
+ ADD COLUMN notification_priority text NOT NULL DEFAULT 'normal',
27
+ ADD COLUMN min_cooldown_seconds integer NOT NULL DEFAULT 0,
28
+ ADD COLUMN last_fired_at timestamp with time zone;
29
+
30
+ ALTER TABLE public.watchers
31
+ ADD CONSTRAINT watchers_notification_channel_check
32
+ CHECK (notification_channel IN ('canvas', 'notification', 'both'));
33
+
34
+ ALTER TABLE public.watchers
35
+ ADD CONSTRAINT watchers_notification_priority_check
36
+ CHECK (notification_priority IN ('low', 'normal', 'high'));
37
+
38
+ ALTER TABLE public.watchers
39
+ ADD CONSTRAINT watchers_min_cooldown_seconds_nonneg
40
+ CHECK (min_cooldown_seconds >= 0);
41
+
42
+ CREATE INDEX IF NOT EXISTS idx_watchers_device_worker_id
43
+ ON public.watchers (device_worker_id)
44
+ WHERE device_worker_id IS NOT NULL;
45
+
46
+ ALTER TABLE public.device_workers
47
+ ADD COLUMN notification_budget_per_day integer NOT NULL DEFAULT 10;
48
+
49
+ ALTER TABLE public.device_workers
50
+ ADD CONSTRAINT device_workers_notification_budget_per_day_nonneg
51
+ CHECK (notification_budget_per_day >= 0);
52
+
53
+ -- migrate:down
54
+
55
+ ALTER TABLE public.device_workers
56
+ DROP CONSTRAINT IF EXISTS device_workers_notification_budget_per_day_nonneg;
57
+
58
+ ALTER TABLE public.device_workers
59
+ DROP COLUMN IF EXISTS notification_budget_per_day;
60
+
61
+ DROP INDEX IF EXISTS public.idx_watchers_device_worker_id;
62
+
63
+ ALTER TABLE public.watchers
64
+ DROP CONSTRAINT IF EXISTS watchers_min_cooldown_seconds_nonneg;
65
+
66
+ ALTER TABLE public.watchers
67
+ DROP CONSTRAINT IF EXISTS watchers_notification_priority_check;
68
+
69
+ ALTER TABLE public.watchers
70
+ DROP CONSTRAINT IF EXISTS watchers_notification_channel_check;
71
+
72
+ ALTER TABLE public.watchers
73
+ DROP COLUMN IF EXISTS last_fired_at,
74
+ DROP COLUMN IF EXISTS min_cooldown_seconds,
75
+ DROP COLUMN IF EXISTS notification_priority,
76
+ DROP COLUMN IF EXISTS notification_channel,
77
+ DROP COLUMN IF EXISTS agent_kind,
78
+ DROP COLUMN IF EXISTS device_worker_id;
@@ -0,0 +1,55 @@
1
+ -- migrate:up
2
+
3
+ -- Goals primitive — a top-level handle that groups watchers under a single
4
+ -- user-facing intent (e.g. "Keep my CRM clean", "Watch competitors"). Each
5
+ -- watcher may optionally point at a goal; goals are the surface the
6
+ -- canvas/UI (#801) hangs off, while watchers stay the executable unit.
7
+ --
8
+ -- Schema notes:
9
+ -- - organization_id is `text` (the better-auth `organization.id`) to match
10
+ -- the rest of the schema; the issue body called it `integer`, but every
11
+ -- other org-scoped table (watchers, feeds, connections, …) uses text.
12
+ -- - `(organization_id, slug)` is unique so `lobu apply` can upsert by slug
13
+ -- the same way it does for watchers/agents.
14
+ -- - Goal-template loading from YAML is out of scope here; `template_key`
15
+ -- is just a free-form pointer for the future loader to claim.
16
+ -- - `metadata` is jsonb for forward-compat (icon, color, owner, etc.)
17
+ -- without another migration each time the UI grows a knob.
18
+
19
+ CREATE TABLE public.goals (
20
+ id bigserial PRIMARY KEY,
21
+ organization_id text NOT NULL REFERENCES public.organization(id) ON DELETE CASCADE,
22
+ slug text NOT NULL,
23
+ name text NOT NULL,
24
+ description text,
25
+ status text NOT NULL DEFAULT 'active',
26
+ template_key text,
27
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
28
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
29
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
30
+
31
+ CONSTRAINT goals_status_check
32
+ CHECK (status IN ('active', 'paused', 'archived')),
33
+ CONSTRAINT goals_org_slug_unique
34
+ UNIQUE (organization_id, slug)
35
+ );
36
+
37
+ CREATE INDEX idx_goals_organization_id
38
+ ON public.goals (organization_id);
39
+
40
+ -- Watcher → goal link. NULL means "ungrouped" (today's behavior). ON DELETE
41
+ -- SET NULL keeps the watcher alive when its goal is archived/deleted; the
42
+ -- watcher just becomes ungrouped.
43
+ ALTER TABLE public.watchers
44
+ ADD COLUMN goal_id bigint REFERENCES public.goals(id) ON DELETE SET NULL;
45
+
46
+ CREATE INDEX idx_watchers_goal_id
47
+ ON public.watchers (goal_id)
48
+ WHERE goal_id IS NOT NULL;
49
+
50
+ -- migrate:down
51
+
52
+ ALTER TABLE public.watchers
53
+ DROP COLUMN IF EXISTS goal_id;
54
+
55
+ DROP TABLE IF EXISTS public.goals;
@@ -0,0 +1,45 @@
1
+ -- migrate:up
2
+
3
+ -- Revert the goals primitive added in 20260517150000_goals_primitive.sql.
4
+ -- Agents already encapsulate the watcher-grouping use case via
5
+ -- watchers.agent_id; goals were a redundant nullable FK + parallel CRUD with
6
+ -- zero behavioral value. The primitive never shipped in a release.
7
+
8
+ DROP INDEX IF EXISTS idx_watchers_goal_id;
9
+
10
+ ALTER TABLE public.watchers
11
+ DROP COLUMN IF EXISTS goal_id;
12
+
13
+ DROP INDEX IF EXISTS idx_goals_organization_id;
14
+
15
+ DROP TABLE IF EXISTS public.goals;
16
+
17
+ -- migrate:down
18
+
19
+ CREATE TABLE public.goals (
20
+ id bigserial PRIMARY KEY,
21
+ organization_id text NOT NULL REFERENCES public.organization(id) ON DELETE CASCADE,
22
+ slug text NOT NULL,
23
+ name text NOT NULL,
24
+ description text,
25
+ status text NOT NULL DEFAULT 'active',
26
+ template_key text,
27
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
28
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
29
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
30
+
31
+ CONSTRAINT goals_status_check
32
+ CHECK (status IN ('active', 'paused', 'archived')),
33
+ CONSTRAINT goals_org_slug_unique
34
+ UNIQUE (organization_id, slug)
35
+ );
36
+
37
+ CREATE INDEX idx_goals_organization_id
38
+ ON public.goals (organization_id);
39
+
40
+ ALTER TABLE public.watchers
41
+ ADD COLUMN goal_id bigint REFERENCES public.goals(id) ON DELETE SET NULL;
42
+
43
+ CREATE INDEX idx_watchers_goal_id
44
+ ON public.watchers (goal_id)
45
+ WHERE goal_id IS NOT NULL;
@@ -0,0 +1,49 @@
1
+ -- migrate:up
2
+
3
+ -- Per-question state for the chat-interaction bridge — moved out of the
4
+ -- gateway's in-process Map so a button click that lands on pod B can claim
5
+ -- a question registered on pod A. The bridge keeps a small per-pod cache for
6
+ -- the platform `SentMessage` (used to edit the original card on click) since
7
+ -- that's a non-serializable SDK handle; everything that matters for routing
8
+ -- the click back into the worker (PostedQuestion + connection context) lives
9
+ -- here.
10
+ --
11
+ -- The claim path scopes by `(id, organization_id, connection_id,
12
+ -- expected_user_id)` — keying by `id` alone would let a click from one
13
+ -- connection or one user consume a question registered for another. The
14
+ -- columns are NOT NULL so the SQL claim is a single index hit with no
15
+ -- branching for NULL semantics.
16
+
17
+ CREATE TABLE public.pending_interactions (
18
+ id text PRIMARY KEY,
19
+ organization_id text NOT NULL REFERENCES public.organization(id) ON DELETE CASCADE,
20
+ connection_id text NOT NULL,
21
+ expected_user_id text NOT NULL,
22
+ entry_payload jsonb NOT NULL,
23
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
24
+ claimed_at timestamp with time zone
25
+ );
26
+
27
+ -- Claim path is
28
+ -- UPDATE pending_interactions
29
+ -- SET claimed_at = now()
30
+ -- WHERE id = $1
31
+ -- AND organization_id = $2
32
+ -- AND connection_id = $3
33
+ -- AND expected_user_id = $4
34
+ -- AND claimed_at IS NULL
35
+ -- RETURNING entry_payload
36
+ -- — a partial index on the unclaimed predicate keeps the lookup index-only.
37
+ CREATE INDEX idx_pending_interactions_unclaimed
38
+ ON public.pending_interactions (id, organization_id, connection_id, expected_user_id)
39
+ WHERE claimed_at IS NULL;
40
+
41
+ -- Background sweeper drops rows older than 24h; index keeps that scan cheap.
42
+ CREATE INDEX idx_pending_interactions_created_at
43
+ ON public.pending_interactions (created_at);
44
+
45
+ -- migrate:down
46
+
47
+ DROP INDEX IF EXISTS public.idx_pending_interactions_created_at;
48
+ DROP INDEX IF EXISTS public.idx_pending_interactions_unclaimed;
49
+ DROP TABLE IF EXISTS public.pending_interactions;
@@ -0,0 +1,22 @@
1
+ -- migrate:up
2
+
3
+ -- Partial index supporting the connector-lane stale-run reaper. The sweeper
4
+ -- query in reapStaleRuns() (packages/server/src/scheduled/check-stalled-executions.ts)
5
+ -- filters runs in the in-progress states (`claimed`, `running`) whose
6
+ -- `last_heartbeat_at` is older than the configured threshold. Without this
7
+ -- index every reaper tick does a full scan of `runs`.
8
+ --
9
+ -- Restricted to the connector lanes (sync, action, embed_backfill, auth). The
10
+ -- lobu-queue lanes (chat_message, schedule, agent_run, internal, task) have
11
+ -- their own per-claim sweep inside RunsQueue keyed on `claimed_at`, not
12
+ -- `last_heartbeat_at`. The `watcher` lane has a dedicated 2h-TTL sweep in
13
+ -- watchers/automation.ts.
14
+
15
+ CREATE INDEX IF NOT EXISTS idx_runs_heartbeat_inflight
16
+ ON public.runs (last_heartbeat_at)
17
+ WHERE status IN ('claimed', 'running')
18
+ AND run_type IN ('sync', 'action', 'embed_backfill', 'auth');
19
+
20
+ -- migrate:down
21
+
22
+ DROP INDEX IF EXISTS public.idx_runs_heartbeat_inflight;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/eval/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IACL,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAsID,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnE;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAK5B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/eval/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IACL,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAiJD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnE;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAK5B"}
@@ -64,6 +64,11 @@ async function collectResponse(session, timeoutMs, messageId) {
64
64
  const controller = new AbortController();
65
65
  const timer = setTimeout(() => controller.abort(), timeoutMs);
66
66
  const start = Date.now();
67
+ // Tracked across the try/finally so we can cancel the body stream on early
68
+ // return. Without this, `return` inside the loop leaves the reader holding
69
+ // the lock and the underlying SSE connection open until the GC closes it
70
+ // — which manifests as test-process hangs and dangling fetches under load.
71
+ let readerForCleanup;
67
72
  try {
68
73
  const res = await fetch(`${session.base}/events`, {
69
74
  headers: { Authorization: `Bearer ${session.token}` },
@@ -73,6 +78,7 @@ async function collectResponse(session, timeoutMs, messageId) {
73
78
  throw new Error(`SSE connection failed (${res.status})`);
74
79
  }
75
80
  const reader = res.body.getReader();
81
+ readerForCleanup = reader;
76
82
  const decoder = new TextDecoder();
77
83
  let buffer = "";
78
84
  let currentEvent = "";
@@ -147,6 +153,11 @@ async function collectResponse(session, timeoutMs, messageId) {
147
153
  }
148
154
  finally {
149
155
  clearTimeout(timer);
156
+ if (readerForCleanup) {
157
+ // Cancel the body stream so the underlying connection is released
158
+ // immediately on early return — otherwise the lock stays held until GC.
159
+ await readerForCleanup.cancel().catch(() => undefined);
160
+ }
150
161
  }
151
162
  }
152
163
  export async function deleteSession(session) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eval/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eval/client.ts"],"names":[],"mappings":"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"}
@@ -109,9 +109,10 @@ function parseInlineResponse(response) {
109
109
  try {
110
110
  const json = extractJSON(response.text);
111
111
  const parsed = JSON.parse(json);
112
+ const fallbackScore = parsed.passed ? 1 : 0;
112
113
  return {
113
114
  passed: Boolean(parsed.passed),
114
- score: typeof parsed.score === "number" ? parsed.score : parsed.passed ? 1 : 0,
115
+ score: typeof parsed.score === "number" ? parsed.score : fallbackScore,
115
116
  reason: String(parsed.reason ?? ""),
116
117
  };
117
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"grader.js","sourceRoot":"","sources":["../../src/eval/grader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grader.js","sourceRoot":"","sources":["../../src/eval/grader.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,8 @@ export interface EvalResult {
84
84
  p50LatencyMs: number;
85
85
  totalTokens: TokenUsage;
86
86
  trials: TrialResult[];
87
+ /** Set when the eval crashed before producing trials — counts as a failure. */
88
+ error?: string;
87
89
  }
88
90
  export interface EvalReport {
89
91
  agent: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/eval/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,eAAe;;;;;;;;;;;iBAUnB,CAAC;AAOH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAc/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/eval/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,eAAe;;;;;;;;;;;iBAUnB,CAAC;AAOH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAc/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,13 @@
1
+ /**
2
+ * Options shared by most cloud subcommands. `--context` is always present;
3
+ * `--org` / `--json` are opt-in. Descriptions here are the canonical ones —
4
+ * commands needing a different wording (e.g. "Org slug override (defaults to
5
+ * [memory].org)") keep their own explicit `.option(...)` call.
6
+ */
7
+ export interface CommonActionOpts {
8
+ context?: string;
9
+ org?: string;
10
+ json?: boolean;
11
+ }
1
12
  export declare function runCli(argv?: readonly string[]): Promise<void>;
2
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA8BA,wBAAsB,MAAM,CAC1B,IAAI,GAAE,SAAS,MAAM,EAAiB,GACrC,OAAO,CAAC,IAAI,CAAC,CAs3Bf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAyBD,wBAAsB,MAAM,CAC1B,IAAI,GAAE,SAAS,MAAM,EAAiB,GACrC,OAAO,CAAC,IAAI,CAAC,CAm+Bf"}