@lmctl-ai/lmctl 0.2.437 → 0.2.439

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.
@@ -898,3 +898,102 @@ CREATE TABLE IF NOT EXISTS prompt_task_reassignments(
898
898
  );
899
899
 
900
900
  CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_reassignments(prompt_id);
901
+
902
+ CREATE TABLE IF NOT EXISTS kv(
903
+ k TEXT PRIMARY KEY,
904
+ v TEXT NOT NULL
905
+ );
906
+
907
+ CREATE TABLE IF NOT EXISTS events(
908
+ id INTEGER PRIMARY KEY,
909
+ ts TEXT NOT NULL,
910
+ scan INTEGER,
911
+ team TEXT NOT NULL,
912
+ status TEXT NOT NULL,
913
+ note TEXT
914
+ );
915
+
916
+ CREATE INDEX IF NOT EXISTS idx_events_team_ts ON events(team, ts);
917
+
918
+ CREATE TABLE IF NOT EXISTS cron_jobs(
919
+ id INTEGER PRIMARY KEY AUTOINCREMENT CHECK(id > 0),
920
+ title TEXT NOT NULL CHECK(length(trim(title)) > 0),
921
+ schedule_expr TEXT NOT NULL CHECK(length(trim(schedule_expr)) > 0),
922
+ action_kind TEXT NOT NULL CHECK(action_kind IN ('enqueue', 'command', 'script', 'session', 'miniplayer')),
923
+ action_payload TEXT NOT NULL CHECK(length(trim(action_payload)) > 0),
924
+ provider TEXT,
925
+ model TEXT,
926
+ working_directory TEXT,
927
+ escalation_owner TEXT,
928
+ session_teamfile TEXT,
929
+ session_alias TEXT,
930
+ session_seeded_at TEXT,
931
+ session_generation INTEGER NOT NULL DEFAULT 0,
932
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK(enabled IN (0, 1)),
933
+ last_checked_ts TEXT,
934
+ last_fired_ts TEXT,
935
+ last_fire_status TEXT CHECK(last_fire_status IS NULL OR
936
+ last_fire_status IN ('ok', 'error', 'skipped_overlap', 'skipped_stale', 'reconciled', 'blocked_escalation')),
937
+ last_fire_error TEXT,
938
+ running_systemd_unit TEXT,
939
+ timezone TEXT,
940
+ running_since_ts TEXT,
941
+ created_at TEXT NOT NULL,
942
+ updated_at TEXT NOT NULL,
943
+ revision INTEGER NOT NULL DEFAULT 1 CHECK(typeof(revision)='integer' AND revision > 0)
944
+ );
945
+
946
+ CREATE INDEX IF NOT EXISTS idx_cron_jobs_enabled ON cron_jobs(enabled);
947
+
948
+ CREATE TABLE IF NOT EXISTS cron_runs(
949
+ id INTEGER PRIMARY KEY AUTOINCREMENT CHECK(id > 0),
950
+ job_id INTEGER NOT NULL,
951
+ run_token_hash TEXT NOT NULL UNIQUE,
952
+ status TEXT NOT NULL CHECK(status IN ('pending', 'running', 'succeeded', 'failed', 'escalated')),
953
+ execution_state TEXT NOT NULL CHECK(execution_state IN ('active', 'uncertain', 'gone')),
954
+ trigger_kind TEXT NOT NULL,
955
+ config_snapshot TEXT NOT NULL,
956
+ execution_identity TEXT,
957
+ pid INTEGER,
958
+ summary TEXT,
959
+ artifacts TEXT,
960
+ escalation_reason TEXT,
961
+ escalation_action TEXT,
962
+ escalation_owner TEXT,
963
+ escalation_resolved_at TEXT,
964
+ escalation_resolution TEXT,
965
+ escalation_resolution_actor TEXT,
966
+ escalation_resolution_note TEXT,
967
+ execution_gone_at TEXT,
968
+ execution_uncertain_reason TEXT,
969
+ execution_confirmation_note TEXT,
970
+ reported_at TEXT,
971
+ created_at TEXT NOT NULL,
972
+ started_at TEXT,
973
+ finished_at TEXT,
974
+ updated_at TEXT NOT NULL
975
+ );
976
+
977
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_cron_runs_active_job ON cron_runs(job_id)
978
+ WHERE execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL);
979
+
980
+ CREATE INDEX IF NOT EXISTS idx_cron_runs_job ON cron_runs(job_id);
981
+
982
+ CREATE INDEX IF NOT EXISTS idx_cron_runs_status ON cron_runs(status);
983
+
984
+ CREATE TABLE IF NOT EXISTS on_demand_launches(
985
+ conversation_id TEXT PRIMARY KEY CHECK(length(trim(conversation_id)) > 0),
986
+ request_hash TEXT NOT NULL,
987
+ generation INTEGER NOT NULL CHECK(generation > 0),
988
+ job_id INTEGER NOT NULL,
989
+ run_id INTEGER,
990
+ state TEXT NOT NULL CHECK(state IN ('claimed', 'retryable', 'adopted')),
991
+ phase TEXT NOT NULL DEFAULT 'reserved' CHECK(phase IN ('reserved', 'dispatching', 'worker_adopted', 'uncertain')),
992
+ worker_pid INTEGER,
993
+ worker_start TEXT,
994
+ receipt_path TEXT,
995
+ owner_pid INTEGER NOT NULL CHECK(owner_pid > 0),
996
+ owner_start TEXT NOT NULL,
997
+ created_at TEXT NOT NULL,
998
+ updated_at TEXT NOT NULL
999
+ );
package/package.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "name": "@lmctl-ai/lmctl",
3
- "version": "0.2.437",
3
+ "version": "0.2.439",
4
4
  "description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
5
5
  "type": "module",
6
6
  "homepage": "https://lmctl.com",
7
7
  "author": "Lattice Systems LLC",
8
8
  "bin": {
9
9
  "lmctl": "bin/lmctl",
10
- "lmscript": "bin/lmscript",
11
- "lmbee": "bin/lmbee"
10
+ "lmscript": "bin/lmscript"
12
11
  },
13
12
  "repository": "git+https://github.com/lmctl-ai/lmctl.git",
14
13
  "bugs": {
@@ -23,10 +22,7 @@
23
22
  "dist/schema.sql",
24
23
  "dist/cli/lmscript.js",
25
24
  "dist/on-demand-worker.cjs",
26
- "dist/lmbee.js",
27
25
  "dist/config/",
28
- "dist/public/",
29
- "dist/vendor-webui/",
30
26
  "build-info.json",
31
27
  "data/price-data.json",
32
28
  "data/price-aliases.json",
package/bin/lmbee DELETED
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env node
2
- import { spawnSync } from 'node:child_process';
3
- import { existsSync, realpathSync } from 'node:fs';
4
- import { dirname, resolve } from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
-
7
- const [nodeMajor, nodeMinor] = process.versions.node.split('.').map((s) => parseInt(s, 10));
8
- if (nodeMajor < 24 || (nodeMajor === 24 && nodeMinor < 15)) {
9
- process.stderr.write(`error: lmbee requires Node.js >= 24.15.0 (detected ${process.versions.node})\n`);
10
- process.exit(1);
11
- }
12
-
13
- process.on('SIGTERM', () => {});
14
- process.on('SIGINT', () => {});
15
-
16
- const selfPath = realpathSync(fileURLToPath(import.meta.url));
17
- const cliPath = resolve(dirname(selfPath), '../dist/lmbee.js');
18
-
19
- if (!existsSync(cliPath)) {
20
- process.stderr.write('error: lmbee is not built.\n');
21
- process.stderr.write(`expected dist entrypoint: ${cliPath}\n`);
22
- process.exit(1);
23
- }
24
-
25
- const result = spawnSync(process.execPath, [cliPath, ...process.argv.slice(2)], {
26
- stdio: 'inherit',
27
- });
28
- if (result.error !== undefined) {
29
- process.stderr.write(`error: failed to launch lmbee cli ${result.error.message}\n`);
30
- process.exit(1);
31
- }
32
- process.exit(result.status ?? 0);
package/build-info.json DELETED
@@ -1 +0,0 @@
1
- {"sha": "9728bee55096d227227f707f2276250c730c56b2", "dirty": false, "builtAt": "2026-10-27T13:45:06.000Z"}