@possumtech/rummy 0.2.7 → 0.3.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 (119) hide show
  1. package/.env.example +12 -3
  2. package/EXCEPTIONS.md +46 -0
  3. package/PLUGINS.md +454 -197
  4. package/SPEC.md +284 -93
  5. package/migrations/001_initial_schema.sql +57 -70
  6. package/package.json +16 -10
  7. package/service.js +1 -1
  8. package/src/agent/AgentLoop.js +254 -70
  9. package/src/agent/ContextAssembler.js +18 -4
  10. package/src/agent/KnownStore.js +156 -23
  11. package/src/agent/ProjectAgent.js +5 -4
  12. package/src/agent/ResponseHealer.js +21 -1
  13. package/src/agent/TurnExecutor.js +393 -115
  14. package/src/agent/XmlParser.js +92 -39
  15. package/src/agent/known_checks.sql +5 -4
  16. package/src/agent/known_queries.sql +4 -3
  17. package/src/agent/known_store.sql +45 -15
  18. package/src/agent/loops.sql +63 -0
  19. package/src/agent/runs.sql +7 -7
  20. package/src/agent/schemes.sql +5 -2
  21. package/src/agent/tokens.js +6 -21
  22. package/src/agent/turns.sql +13 -4
  23. package/src/hooks/Hooks.js +18 -0
  24. package/src/hooks/PluginContext.js +14 -10
  25. package/src/hooks/RummyContext.js +30 -10
  26. package/src/hooks/ToolRegistry.js +83 -19
  27. package/src/llm/LlmProvider.js +27 -8
  28. package/src/llm/OpenAiClient.js +20 -0
  29. package/src/llm/OpenRouterClient.js +24 -2
  30. package/src/llm/XaiClient.js +47 -2
  31. package/src/plugins/ask_user/README.md +4 -4
  32. package/src/plugins/ask_user/ask_user.js +8 -7
  33. package/src/plugins/ask_user/ask_userDoc.js +29 -0
  34. package/src/plugins/budget/BudgetGuard.js +74 -0
  35. package/src/plugins/budget/README.md +43 -0
  36. package/src/plugins/budget/budget.js +79 -0
  37. package/src/plugins/cp/README.md +5 -4
  38. package/src/plugins/cp/cp.js +16 -12
  39. package/src/plugins/cp/cpDoc.js +29 -0
  40. package/src/plugins/current/README.md +4 -4
  41. package/src/plugins/current/current.js +12 -10
  42. package/src/plugins/engine/engine.sql +5 -10
  43. package/src/plugins/engine/turn_context.sql +13 -13
  44. package/src/plugins/env/README.md +3 -4
  45. package/src/plugins/env/env.js +8 -7
  46. package/src/plugins/env/envDoc.js +29 -0
  47. package/src/plugins/file/README.md +9 -12
  48. package/src/plugins/file/file.js +34 -45
  49. package/src/plugins/get/README.md +2 -2
  50. package/src/plugins/get/get.js +28 -11
  51. package/src/plugins/get/getDoc.js +41 -0
  52. package/src/plugins/hedberg/docs.md +0 -9
  53. package/src/plugins/hedberg/hedberg.js +4 -6
  54. package/src/plugins/hedberg/matcher.js +1 -1
  55. package/src/plugins/hedberg/normalize.js +28 -0
  56. package/src/plugins/hedberg/patterns.js +31 -33
  57. package/src/plugins/hedberg/sed.js +17 -10
  58. package/src/plugins/helpers.js +2 -2
  59. package/src/plugins/index.js +93 -28
  60. package/src/plugins/instructions/README.md +6 -2
  61. package/src/plugins/instructions/instructions.js +21 -5
  62. package/src/plugins/instructions/preamble.md +9 -5
  63. package/src/plugins/known/README.md +10 -7
  64. package/src/plugins/known/known.js +33 -23
  65. package/src/plugins/known/knownDoc.js +33 -0
  66. package/src/plugins/mv/README.md +5 -4
  67. package/src/plugins/mv/mv.js +16 -12
  68. package/src/plugins/mv/mvDoc.js +31 -0
  69. package/src/plugins/persona/persona.js +78 -0
  70. package/src/plugins/previous/README.md +2 -2
  71. package/src/plugins/previous/previous.js +12 -8
  72. package/src/plugins/progress/progress.js +44 -12
  73. package/src/plugins/prompt/README.md +5 -5
  74. package/src/plugins/prompt/prompt.js +23 -19
  75. package/src/plugins/rm/README.md +4 -4
  76. package/src/plugins/rm/rm.js +29 -12
  77. package/src/plugins/rm/rmDoc.js +30 -0
  78. package/src/plugins/rpc/README.md +15 -28
  79. package/src/plugins/rpc/rpc.js +63 -107
  80. package/src/plugins/set/README.md +13 -12
  81. package/src/plugins/set/set.js +82 -21
  82. package/src/plugins/set/setDoc.js +45 -0
  83. package/src/plugins/sh/README.md +4 -4
  84. package/src/plugins/sh/sh.js +8 -7
  85. package/src/plugins/sh/shDoc.js +29 -0
  86. package/src/plugins/{skills/skills.js → skill/skill.js} +12 -54
  87. package/src/plugins/summarize/README.md +6 -5
  88. package/src/plugins/summarize/summarize.js +7 -6
  89. package/src/plugins/summarize/summarizeDoc.js +33 -0
  90. package/src/plugins/telemetry/telemetry.js +20 -8
  91. package/src/plugins/think/README.md +20 -0
  92. package/src/plugins/think/think.js +5 -0
  93. package/src/plugins/unknown/README.md +5 -5
  94. package/src/plugins/unknown/unknown.js +11 -8
  95. package/src/plugins/unknown/unknownDoc.js +31 -0
  96. package/src/plugins/update/README.md +3 -8
  97. package/src/plugins/update/update.js +7 -6
  98. package/src/plugins/update/updateDoc.js +33 -0
  99. package/src/server/ClientConnection.js +3 -5
  100. package/src/server/RpcRegistry.js +52 -4
  101. package/src/sql/v_model_context.sql +31 -39
  102. package/src/sql/v_run_log.sql +3 -3
  103. package/src/agent/prompt_queue.sql +0 -39
  104. package/src/plugins/ask_user/docs.md +0 -2
  105. package/src/plugins/cp/docs.md +0 -2
  106. package/src/plugins/env/docs.md +0 -2
  107. package/src/plugins/get/docs.md +0 -6
  108. package/src/plugins/known/docs.md +0 -3
  109. package/src/plugins/mv/docs.md +0 -2
  110. package/src/plugins/rm/docs.md +0 -4
  111. package/src/plugins/set/docs.md +0 -4
  112. package/src/plugins/sh/docs.md +0 -2
  113. package/src/plugins/skills/README.md +0 -25
  114. package/src/plugins/store/README.md +0 -20
  115. package/src/plugins/store/docs.md +0 -5
  116. package/src/plugins/store/store.js +0 -52
  117. package/src/plugins/summarize/docs.md +0 -4
  118. package/src/plugins/unknown/docs.md +0 -5
  119. package/src/plugins/update/docs.md +0 -4
@@ -4,13 +4,12 @@ PRAGMA mmap_size = $mmap_size;
4
4
  -- INIT: initial_schema
5
5
 
6
6
  -- Scheme registry: single source of truth for all scheme metadata.
7
- -- fidelity: 'full' = always visible, 'turn' = visible when turn>0, 'null' = never visible.
8
- -- valid_states: JSON array of allowed state values for this scheme.
7
+ -- Status codes are HTTP: 2xx success, 3xx redirect, 4xx model error, 5xx system error.
8
+ -- No valid_states HTTP semantics are universal.
9
+ -- No fidelity — entries don't decide their own importance.
9
10
  CREATE TABLE IF NOT EXISTS schemes (
10
11
  name TEXT PRIMARY KEY
11
- , fidelity TEXT NOT NULL CHECK (fidelity IN ('full', 'turn', 'null'))
12
12
  , model_visible BOOLEAN NOT NULL DEFAULT 1
13
- , valid_states TEXT NOT NULL
14
13
  , category TEXT
15
14
  );
16
15
 
@@ -37,15 +36,14 @@ CREATE TABLE IF NOT EXISTS models (
37
36
  );
38
37
 
39
38
  -- Runs: execution units belonging to a project.
40
- -- Each run has its own config (temperature, persona, context_limit).
39
+ -- Status uses HTTP codes: 100=queued, 102=running, 200=completed,
40
+ -- 202=proposed, 500=failed, 499=aborted.
41
41
  CREATE TABLE IF NOT EXISTS runs (
42
42
  id INTEGER PRIMARY KEY AUTOINCREMENT
43
43
  , project_id INTEGER NOT NULL REFERENCES projects (id) ON DELETE CASCADE
44
44
  , parent_run_id INTEGER REFERENCES runs (id) ON DELETE SET NULL
45
45
  , model TEXT
46
- , status TEXT NOT NULL DEFAULT 'queued' CHECK (
47
- status IN ('queued', 'running', 'proposed', 'completed', 'failed', 'aborted')
48
- )
46
+ , status INTEGER NOT NULL DEFAULT 100 CHECK (status BETWEEN 100 AND 599)
49
47
  , alias TEXT NOT NULL UNIQUE
50
48
  , temperature REAL CHECK (
51
49
  temperature IS NULL OR (temperature >= 0 AND temperature <= 2)
@@ -53,17 +51,42 @@ CREATE TABLE IF NOT EXISTS runs (
53
51
  , persona TEXT
54
52
  , context_limit INTEGER CHECK (context_limit IS NULL OR context_limit >= 1024)
55
53
  , next_turn INTEGER NOT NULL DEFAULT 1 CHECK (next_turn >= 1)
54
+ , next_loop INTEGER NOT NULL DEFAULT 1 CHECK (next_loop >= 1)
56
55
  , created_at DATETIME DEFAULT CURRENT_TIMESTAMP
57
56
  );
58
57
 
59
58
  CREATE INDEX IF NOT EXISTS idx_runs_alias ON runs (alias);
60
59
  CREATE INDEX IF NOT EXISTS idx_runs_project ON runs (project_id);
61
60
 
61
+ -- Loops: execution units within a run. Each ask/act call creates a loop.
62
+ -- Status: 100=pending, 102=running, 200=completed, 202=proposed,
63
+ -- 500=failed, 499=aborted.
64
+ CREATE TABLE IF NOT EXISTS loops (
65
+ id INTEGER PRIMARY KEY AUTOINCREMENT
66
+ , run_id INTEGER NOT NULL REFERENCES runs (id) ON DELETE CASCADE
67
+ , sequence INTEGER NOT NULL CHECK (sequence >= 1)
68
+ , mode TEXT NOT NULL CHECK (mode IN ('ask', 'act', 'panic'))
69
+ , model TEXT
70
+ , prompt TEXT NOT NULL DEFAULT ''
71
+ , status INTEGER NOT NULL DEFAULT 100 CHECK (status BETWEEN 100 AND 599)
72
+ , config JSON
73
+ , result JSON
74
+ , created_at DATETIME DEFAULT CURRENT_TIMESTAMP
75
+ , UNIQUE (run_id, sequence)
76
+ );
77
+ CREATE INDEX IF NOT EXISTS idx_loops_run ON loops (run_id);
78
+ -- Enforce at most one running loop per run.
79
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_loops_one_active
80
+ ON loops (run_id) WHERE status = 102;
81
+
62
82
  -- Turns: usage stats and sequencing (operational, not model-facing)
63
83
  CREATE TABLE IF NOT EXISTS turns (
64
84
  id INTEGER PRIMARY KEY AUTOINCREMENT
65
85
  , run_id INTEGER NOT NULL REFERENCES runs (id) ON DELETE CASCADE
86
+ , loop_id INTEGER NOT NULL REFERENCES loops (id) ON DELETE CASCADE
66
87
  , sequence INTEGER NOT NULL CHECK (sequence >= 1)
88
+ , context_tokens INTEGER NOT NULL DEFAULT 0 CHECK (context_tokens >= 0)
89
+ , reasoning_content TEXT
67
90
  , prompt_tokens INTEGER NOT NULL DEFAULT 0 CHECK (prompt_tokens >= 0)
68
91
  , cached_tokens INTEGER NOT NULL DEFAULT 0 CHECK (cached_tokens >= 0)
69
92
  , completion_tokens INTEGER NOT NULL DEFAULT 0 CHECK (completion_tokens >= 0)
@@ -90,15 +113,20 @@ ON file_constraints (project_id);
90
113
  -- Known K/V Store: the unified state machine.
91
114
  -- Files, knowledge, tool results, audit — everything is a keyed entry.
92
115
  -- scheme: derived from path via schemeOf(). Generated column.
93
- -- State validated by trigger against schemes.valid_states.
116
+ -- status: HTTP status code (2xx success, 4xx model error, 5xx system error).
117
+ -- fidelity: visibility level, independently managed by relevance engine.
94
118
  CREATE TABLE IF NOT EXISTS known_entries (
95
119
  id INTEGER PRIMARY KEY AUTOINCREMENT
96
120
  , run_id INTEGER NOT NULL REFERENCES runs (id) ON DELETE CASCADE
121
+ , loop_id INTEGER REFERENCES loops (id) ON DELETE CASCADE
97
122
  , turn INTEGER NOT NULL DEFAULT 0 CHECK (turn >= 0)
98
- , path TEXT NOT NULL
123
+ , path TEXT NOT NULL CHECK (length(path) <= 2048)
99
124
  , body TEXT NOT NULL DEFAULT ''
100
125
  , scheme TEXT GENERATED ALWAYS AS (schemeOf(path)) STORED
101
- , state TEXT NOT NULL
126
+ , status INTEGER NOT NULL DEFAULT 200 CHECK (status BETWEEN 100 AND 599)
127
+ , fidelity TEXT NOT NULL DEFAULT 'full' CHECK (
128
+ fidelity IN ('full', 'summary', 'index', 'archive')
129
+ )
102
130
  , hash TEXT
103
131
  , attributes JSON NOT NULL DEFAULT '{}' CHECK (json_valid(attributes))
104
132
  , tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0)
@@ -110,43 +138,14 @@ CREATE TABLE IF NOT EXISTS known_entries (
110
138
  );
111
139
  CREATE UNIQUE INDEX IF NOT EXISTS idx_known_entries_run_path
112
140
  ON known_entries (run_id, path);
113
- CREATE INDEX IF NOT EXISTS idx_known_entries_scheme_state
114
- ON known_entries (run_id, scheme, state);
141
+ CREATE INDEX IF NOT EXISTS idx_known_entries_scheme_status
142
+ ON known_entries (run_id, scheme, status);
115
143
  CREATE INDEX IF NOT EXISTS idx_known_entries_turn
116
144
  ON known_entries (run_id, turn);
117
145
 
118
- -- Validate state against schemes.valid_states on insert.
119
- CREATE TRIGGER IF NOT EXISTS trg_known_entry_state_insert
120
- BEFORE INSERT ON known_entries
121
- FOR EACH ROW
122
- BEGIN
123
- SELECT RAISE(ABORT, 'invalid state for scheme')
124
- WHERE NOT EXISTS (
125
- SELECT 1
126
- FROM schemes AS s, json_each(s.valid_states) AS j
127
- WHERE
128
- s.name = COALESCE(schemeOf(NEW.path), 'file')
129
- AND j.value = NEW.state
130
- );
131
- END;
146
+ -- No state validation triggers HTTP status codes are universal.
132
147
 
133
- -- Validate state against schemes.valid_states on update.
134
- CREATE TRIGGER IF NOT EXISTS trg_known_entry_state_update
135
- BEFORE UPDATE OF state ON known_entries
136
- FOR EACH ROW
137
- WHEN OLD.state != NEW.state
138
- BEGIN
139
- SELECT RAISE(ABORT, 'invalid state for scheme')
140
- WHERE NOT EXISTS (
141
- SELECT 1
142
- FROM schemes AS s, json_each(s.valid_states) AS j
143
- WHERE
144
- s.name = COALESCE(schemeOf(NEW.path), 'file')
145
- AND j.value = NEW.state
146
- );
147
- END;
148
-
149
- -- UNRESOLVED VIEW: all entries awaiting user action
148
+ -- UNRESOLVED VIEW: all entries awaiting user action (202 Accepted)
150
149
  CREATE VIEW IF NOT EXISTS v_unresolved AS
151
150
  SELECT
152
151
  run_id
@@ -155,30 +154,31 @@ SELECT
155
154
  , attributes
156
155
  , turn
157
156
  FROM known_entries
158
- WHERE state = 'proposed';
157
+ WHERE status = 202;
159
158
 
160
159
  -- Turn context: materialized snapshot of what the model sees each turn.
161
160
  -- known_entries is the warehouse. turn_context is the shipment.
162
161
  CREATE TABLE IF NOT EXISTS turn_context (
163
162
  id INTEGER PRIMARY KEY AUTOINCREMENT
164
163
  , run_id INTEGER NOT NULL REFERENCES runs (id) ON DELETE CASCADE
164
+ , loop_id INTEGER REFERENCES loops (id) ON DELETE CASCADE
165
165
  , turn INTEGER NOT NULL CHECK (turn >= 1)
166
166
  , ordinal INTEGER NOT NULL CHECK (ordinal >= 0)
167
167
  , path TEXT NOT NULL
168
168
  , scheme TEXT GENERATED ALWAYS AS (schemeOf(path)) STORED
169
+ , status INTEGER NOT NULL DEFAULT 200 CHECK (status BETWEEN 100 AND 599)
169
170
  , fidelity TEXT NOT NULL CHECK (fidelity IN ('full', 'summary', 'index'))
170
- , state TEXT NOT NULL DEFAULT 'full'
171
171
  , body TEXT NOT NULL DEFAULT ''
172
172
  , tokens INTEGER NOT NULL DEFAULT 0 CHECK (tokens >= 0)
173
173
  , attributes JSON NOT NULL DEFAULT '{}' CHECK (json_valid(attributes))
174
- , category TEXT NOT NULL DEFAULT 'result'
174
+ , category TEXT NOT NULL DEFAULT 'logging'
175
175
  , source_turn INTEGER DEFAULT 0
176
176
  );
177
177
  CREATE INDEX IF NOT EXISTS idx_turn_context_run_turn
178
178
  ON turn_context (run_id, turn);
179
179
 
180
- -- Enforce valid run state transitions.
181
- -- completed running: continuation (new turn on finished run)
180
+ -- Enforce valid run state transitions (HTTP status codes).
181
+ -- 100=queued, 102=running, 200=completed, 202=proposed, 499=aborted, 500=failed.
182
182
  CREATE TRIGGER IF NOT EXISTS trg_run_state_transition
183
183
  BEFORE UPDATE OF status ON runs
184
184
  FOR EACH ROW
@@ -186,30 +186,17 @@ WHEN OLD.status != NEW.status
186
186
  BEGIN
187
187
  SELECT RAISE(ABORT, 'invalid run state transition')
188
188
  WHERE NOT (
189
- (OLD.status = 'queued' AND NEW.status IN ('running', 'aborted'))
190
- OR (OLD.status = 'running' AND NEW.status IN ('proposed', 'completed', 'failed', 'aborted'))
191
- OR (OLD.status = 'proposed' AND NEW.status IN ('running', 'completed', 'aborted'))
192
- OR (OLD.status = 'completed' AND NEW.status IN ('running', 'aborted'))
193
- OR (OLD.status = 'failed' AND NEW.status IN ('running', 'aborted'))
194
- OR (OLD.status = 'aborted' AND NEW.status IN ('running'))
189
+ (OLD.status = 100 AND NEW.status IN (102, 499))
190
+ OR (OLD.status = 102 AND NEW.status IN (200, 202, 500, 499))
191
+ OR (OLD.status = 202 AND NEW.status IN (102, 200, 499))
192
+ OR (OLD.status = 200 AND NEW.status IN (102, 499))
193
+ OR (OLD.status = 500 AND NEW.status IN (102, 499))
194
+ OR (OLD.status = 499 AND NEW.status IN (102))
195
195
  );
196
196
  END;
197
197
 
198
- -- Prompt queue. All prompts flow through here. Worker consumes FIFO per run.
199
- CREATE TABLE IF NOT EXISTS prompt_queue (
200
- id INTEGER PRIMARY KEY AUTOINCREMENT
201
- , run_id INTEGER NOT NULL REFERENCES runs (id) ON DELETE CASCADE
202
- , mode TEXT NOT NULL CHECK (mode IN ('ask', 'act'))
203
- , model TEXT
204
- , prompt TEXT NOT NULL
205
- , config JSON
206
- , status TEXT NOT NULL DEFAULT 'pending'
207
- CHECK (status IN ('pending', 'active', 'completed', 'aborted'))
208
- , result JSON
209
- , created_at DATETIME DEFAULT CURRENT_TIMESTAMP
210
- );
211
-
212
- CREATE INDEX IF NOT EXISTS idx_prompt_queue_run ON prompt_queue (run_id, status);
198
+ -- Prompt queue is the loops table (defined above).
199
+ -- Each ask/act enqueues a loop (status=pending). Worker claims FIFO per run.
213
200
 
214
201
  -- RPC audit log. Every call recorded unconditionally.
215
202
  CREATE TABLE IF NOT EXISTS rpc_log (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@possumtech/rummy",
3
- "version": "0.2.7",
3
+ "version": "0.3.0",
4
4
  "description": "Relational Unknowns Memory Management Yoke",
5
5
  "keywords": [
6
6
  "llm"
@@ -37,22 +37,28 @@
37
37
  "fix:sql": ". .venv/bin/activate && sqlfluff fix . --force",
38
38
  "test": "npm run lint && npm run test:unit && npm run test:intg",
39
39
  "test:all": "npm run lint && npm run test:unit && npm run test:intg && npm run test:e2e",
40
- "test:unit": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --experimental-test-coverage --test-coverage-lines=70 --test-coverage-branches=70 --test-coverage-functions=70 --test-concurrency=1 --test $(find src -name '*.test.js')",
40
+ "test:unit": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --experimental-test-coverage --test-coverage-lines=50 --test-coverage-branches=50 --test-coverage-functions=50 --test-concurrency=1 --test-force-exit --test $(find src -name '*.test.js')",
41
41
  "test:intg": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test-concurrency=1 --test $(find test/integration -name '*.test.js')",
42
- "test:e2e": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test-concurrency=1 --test-force-exit --test-reporter=spec --test $(find test/e2e -name '*.test.js')",
43
- "test:live": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test-concurrency=1 --test-force-exit --test-reporter=spec --test $(find test/live -name '*.test.js')"
42
+ "test:e2e": "mkdir -p /tmp/rummy_test_diag && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test-concurrency=1 --test-force-exit --test-reporter=spec --test $(find test/e2e -name '*.test.js') 2>&1 | tee /tmp/rummy_test_diag/e2e_$(date +%Y%m%dT%H%M%S).log",
43
+ "test:live": "mkdir -p /tmp/rummy_test_diag && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test --test-concurrency=1 --test-force-exit --test-reporter=spec --test $(find test/live -name '*.test.js') 2>&1 | tee /tmp/rummy_test_diag/live_$(date +%Y%m%dT%H%M%S).log",
44
+ "test:clean": "rm -rf test/lme/results test/mab/results test/tmp /tmp/rummy_test_diag /tmp/rummy_test_*.db /tmp/rummy_test_*.db-shm /tmp/rummy_test_*.db-wal && echo 'Test artifacts cleaned.'",
45
+ "test:mab:get": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test test/mab/download.js",
46
+ "test:mab": "mkdir -p /tmp/rummy_test_diag && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test test/mab/runner.js 2>&1 | tee /tmp/rummy_test_diag/mab_$(date +%Y%m%dT%H%M%S).log",
47
+ "test:lme:get": "node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test test/lme/download.js",
48
+ "test:lme": "mkdir -p /tmp/rummy_test_diag && node --env-file-if-exists=.env.example --env-file-if-exists=.env --env-file-if-exists=.env.test test/lme/runner.js 2>&1 | tee /tmp/rummy_test_diag/lme_$(date +%Y%m%dT%H%M%S).log",
49
+ "test:mab:clean": "rm -rf test/mab/results/*/",
50
+ "test:lme:clean": "rm -rf test/lme/results/*/",
51
+ "test:clear": "rm -rf /tmp/rummy_test_diag /tmp/rummy_test_*.db /tmp/rummy_test_*.db-shm /tmp/rummy_test_*.db-wal /tmp/rummy-stories-*"
44
52
  },
45
53
  "devDependencies": {
46
54
  "@biomejs/biome": "^2.4.6"
47
55
  },
48
56
  "dependencies": {
49
57
  "@possumtech/sqlrite": "^3.1.0",
58
+ "@xmldom/xmldom": "^0.9.9",
50
59
  "htmlparser2": "^12.0.0",
51
- "tiktoken": "^1.0.22",
52
- "ws": "^8.19.0"
53
- },
54
- "optionalDependencies": {
55
- "@possumtech/rummy.repo": "^0.0.4",
56
- "@possumtech/rummy.web": "^0.0.7"
60
+ "picomatch": "^4.0.4",
61
+ "ws": "^8.19.0",
62
+ "xpath": "^0.0.34"
57
63
  }
58
64
  }
package/service.js CHANGED
@@ -115,7 +115,7 @@ async function main() {
115
115
  }
116
116
 
117
117
  // 6b. Abort stuck runs (can't be running if the server just started)
118
- await db.reset_active_prompts.run({});
118
+ await db.reset_active_loops.run({});
119
119
  const aborted = await db.abort_stuck_runs.run({});
120
120
  if (aborted.changes > 0) {
121
121
  console.log(`[RUMMY] Recovered ${aborted.changes} stuck run(s)`);