opencode-swarm-plugin 0.63.0 → 0.63.2

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.
@@ -6291,7 +6291,7 @@ var require_formats = __commonJS((exports2) => {
6291
6291
  }
6292
6292
  var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;
6293
6293
  function getTime(strictTimeZone) {
6294
- return function time(str) {
6294
+ return function time3(str) {
6295
6295
  const matches = TIME.exec(str);
6296
6296
  if (!matches)
6297
6297
  return false;
@@ -14628,7 +14628,7 @@ function possiblyAsyncStringify(value) {
14628
14628
  return { delay, cancel };
14629
14629
  }
14630
14630
  const unknownState = { state: "unknown", value: undefined };
14631
- const getAsyncContent = function getAsyncContent(data) {
14631
+ const getAsyncContent = function getAsyncContent2(data) {
14632
14632
  const cacheKey = data;
14633
14633
  if (cache.has(cacheKey)) {
14634
14634
  return cache.get(cacheKey);
@@ -18097,13 +18097,13 @@ class CommandWrapper {
18097
18097
  this.hasRan = false;
18098
18098
  if (hasToStringMethod(cmd)) {
18099
18099
  const method = cmd[toStringMethod];
18100
- this[toStringMethod] = function toStringMethod() {
18100
+ this[toStringMethod] = function toStringMethod2() {
18101
18101
  return method.call(cmd);
18102
18102
  };
18103
18103
  }
18104
18104
  if (hasAsyncToStringMethod(cmd)) {
18105
18105
  const method = cmd[asyncToStringMethod];
18106
- this[asyncToStringMethod] = function asyncToStringMethod() {
18106
+ this[asyncToStringMethod] = function asyncToStringMethod2() {
18107
18107
  return method.call(cmd);
18108
18108
  };
18109
18109
  }
@@ -29321,8 +29321,48 @@ async function runMigrations(db2) {
29321
29321
  }
29322
29322
  }
29323
29323
  const finalVersion = await getCurrentVersion3(db2);
29324
+ await healMemorySchema(db2);
29324
29325
  return { applied, current: finalVersion };
29325
29326
  }
29327
+ async function healMemorySchema(db2) {
29328
+ try {
29329
+ const tableCheck = await db2.query(`SELECT name FROM sqlite_master WHERE type='table' AND name='memories'`);
29330
+ if (tableCheck.rows.length === 0)
29331
+ return;
29332
+ const columnsResult = await db2.query(`SELECT name FROM pragma_table_info('memories')`);
29333
+ const existingColumns = new Set(columnsResult.rows.map((r) => r.name));
29334
+ const expectedColumns = [
29335
+ { name: "tags", type: "TEXT", defaultVal: "'[]'" },
29336
+ { name: "updated_at", type: "TEXT", defaultVal: "(datetime('now'))" },
29337
+ { name: "decay_factor", type: "REAL", defaultVal: "1.0" },
29338
+ { name: "access_count", type: "TEXT", defaultVal: "'0'" },
29339
+ { name: "last_accessed", type: "TEXT", defaultVal: "(datetime('now'))" },
29340
+ { name: "category", type: "TEXT", defaultVal: "NULL" },
29341
+ { name: "status", type: "TEXT", defaultVal: "'active'" },
29342
+ { name: "valid_from", type: "TEXT", defaultVal: "NULL" },
29343
+ { name: "valid_until", type: "TEXT", defaultVal: "NULL" },
29344
+ { name: "superseded_by", type: "TEXT", defaultVal: "NULL" },
29345
+ { name: "auto_tags", type: "TEXT", defaultVal: "NULL" },
29346
+ { name: "keywords", type: "TEXT", defaultVal: "NULL" }
29347
+ ];
29348
+ let healed = 0;
29349
+ for (const col of expectedColumns) {
29350
+ if (!existingColumns.has(col.name)) {
29351
+ try {
29352
+ const defaultClause = col.defaultVal === "NULL" ? "" : ` DEFAULT ${col.defaultVal}`;
29353
+ await db2.exec(`ALTER TABLE memories ADD COLUMN ${col.name} ${col.type}${defaultClause}`);
29354
+ healed++;
29355
+ console.log(`[migrations] healed: added missing column memories.${col.name}`);
29356
+ } catch {}
29357
+ }
29358
+ }
29359
+ if (healed > 0) {
29360
+ console.log(`[migrations] self-heal: added ${healed} missing column(s) to memories table`);
29361
+ }
29362
+ } catch (error46) {
29363
+ console.warn("[migrations] self-heal failed (non-fatal):", error46.message);
29364
+ }
29365
+ }
29326
29366
  async function rollbackTo(db2, targetVersion) {
29327
29367
  const currentVersion = await getCurrentVersion3(db2);
29328
29368
  const rolledBack = [];
@@ -62543,7 +62583,7 @@ ${prefix}}`;
62543
62583
  entry.expiresAt = clock3.unsafeCurrentTimeMillis() + toMillis(self2.idleTimeToLive);
62544
62584
  if (entry.fiber)
62545
62585
  return void_3;
62546
- return interruptibleMask(function loop(restore) {
62586
+ return interruptibleMask(function loop4(restore) {
62547
62587
  const now3 = clock3.unsafeCurrentTimeMillis();
62548
62588
  const remaining = entry.expiresAt - now3;
62549
62589
  if (remaining <= 0) {
@@ -62552,7 +62592,7 @@ ${prefix}}`;
62552
62592
  remove8(self2.state.map, key);
62553
62593
  return restore(scopeClose(entry.scope, exitVoid));
62554
62594
  }
62555
- return flatMap12(clock3.sleep(millis(remaining)), () => loop(restore));
62595
+ return flatMap12(clock3.sleep(millis(remaining)), () => loop4(restore));
62556
62596
  }).pipe(ensuring2(sync(() => {
62557
62597
  entry.fiber = undefined;
62558
62598
  })), forkIn2(self2.scope), tap2((fiber) => {
@@ -65982,7 +66022,7 @@ ${prefix}}`;
65982
66022
  fromDriver(value10) {
65983
66023
  return Array.from(new Float32Array(value10.buffer));
65984
66024
  }
65985
- }), memories, memoryLinks, entities, entityTaxonomy, relationships, memoryEntities, init_memory, init_expressions2, exports_drizzle_orm, init_drizzle_orm, exports_streams, eventsTable, agentsTable, messagesTable, messageRecipientsTable, reservationsTable, locksTable, cursorsTable, evalRecordsTable, swarmContextsTable, decisionTracesTable, entityLinksTable, init_streams, exports_hive, beads, cells, cellEvents, beadLabels, cellLabels, beadComments, cellComments, beadDependencies, cellDependencies, blockedBeadsCache, dirtyBeads, schemaVersion, init_hive, exports_schema, init_schema, init_drizzle, require_entity, require_logger, require_query_promise, require_column, require_column_builder, require_table_utils, require_foreign_keys, require_tracing_utils, require_unique_constraint, require_array, require_common2, require_enum, require_subquery, require_version, require_tracing, require_view_common, require_table, require_sql, require_alias, require_selection_proxy, require_utils, require_delete, require_casing, require_errors, require_int_common, require_bigint, require_bigserial, require_boolean, require_char, require_cidr, require_custom, require_date_common, require_date, require_double_precision, require_inet, require_integer, require_interval, require_json, require_jsonb, require_line, require_macaddr, require_macaddr8, require_numeric, require_point, require_utils2, require_geometry, require_real, require_serial, require_smallint, require_smallserial, require_text, require_time, require_timestamp, require_uuid, require_varchar, require_bit, require_halfvec, require_sparsevec, require_vector, require_columns, require_all, require_table2, require_primary_keys, require_conditions, require_select, require_expressions, require_relations, require_aggregate, require_vector2, require_functions, require_sql2, require_view_base, require_dialect, require_query_builder, require_select2, require_query_builder2, require_insert, require_refresh_materialized_view, require_select_types, require_update, require_query_builders, require_count, require_query, require_raw, require_db, require_alias2, require_checks, require_indexes, require_policies, require_roles, require_sequence, require_view_common2, require_view, require_schema, require_session, require_subquery2, require_utils3, require_utils4, require_pg_core, require_session2, require_driver, require_pglite, exports_libsql_convenience, instances, init_libsql_convenience, exports_lock, DurableLock, DurableLockLive, init_lock, exports_reservation_utils, init_reservation_utils, init_projections_drizzle, exports_store_drizzle, init_store_drizzle, exports_swarm_mail, MAX_INBOX_LIMIT = 5, DEFAULT_TTL_SECONDS = 3600, ADJECTIVES, NOUNS, init_swarm_mail, MAX_INBOX_LIMIT2 = 5, DEFAULT_TTL_SECONDS2 = 3600, ADJECTIVES2, NOUNS2, init_agent_mail, exports_migrations, beadsMigration, cellsViewMigration, cellsViewMigrationLibSQL, beadsMigrationLibSQL, beadsResultColumnsMigration, beadsResultColumnsMigrationLibSQL, beadsMigrations, hiveMigrations, sessionsMigrationLibSQL, hiveMigrationsLibSQL, init_migrations, memoryMigration, memoryMigrations, init_migrations2, exports_migrations2, migrations, init_migrations3, urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", POOL_SIZE_MULTIPLIER = 128, pool, poolOffset, init_nanoid = () => {}, init_decision_trace_store, ClientBuffer, init_client_buffer, exports_streams2, SLOW_QUERY_THRESHOLD_MS = 100, init_streams2, exports_store, adapterCache, TIMESTAMP_SAFE_UNTIL, init_store, init_adapter, exports_dependencies_drizzle, MAX_DEPENDENCY_DEPTH = 100, init_dependencies_drizzle, exports_projections_drizzle, init_projections_drizzle2, exports_dependencies, MAX_DEPENDENCY_DEPTH2 = 100, init_store2, FIELD_SETS, init_pagination, marker = "vercel.ai.error", symbol6, _a, _b, AISDKError, name2 = "AI_APICallError", marker2, symbol222, _a2, _b2, APICallError, name22 = "AI_EmptyResponseBodyError", marker3, symbol32, _a3, _b3, EmptyResponseBodyError, name3 = "AI_InvalidArgumentError", marker4, symbol42, _a4, _b4, InvalidArgumentError, name4 = "AI_InvalidPromptError", marker5, symbol52, _a5, _b5, InvalidPromptError, name5 = "AI_InvalidResponseDataError", marker6, symbol62, _a6, _b6, InvalidResponseDataError, name6 = "AI_JSONParseError", marker7, symbol7, _a7, _b7, JSONParseError, name7 = "AI_LoadAPIKeyError", marker8, symbol8, _a8, _b8, LoadAPIKeyError, name8 = "AI_LoadSettingError", marker9, symbol9, _a9, _b9, LoadSettingError, name9 = "AI_NoContentGeneratedError", marker10, symbol10, _a10, _b10, NoContentGeneratedError, name10 = "AI_NoSuchModelError", marker11, symbol11, _a11, _b11, NoSuchModelError, name11 = "AI_TooManyEmbeddingValuesForCallError", marker12, symbol12, _a12, _b12, TooManyEmbeddingValuesForCallError, name12 = "AI_TypeValidationError", marker13, symbol13, _a13, _b13, TypeValidationError, name13 = "AI_UnsupportedFunctionalityError", marker14, symbol14, _a14, _b14, UnsupportedFunctionalityError, init_dist3, NEVER22, $brand2, $ZodAsyncError2, globalConfig2, init_core32, exports_util2, captureStackTrace2, allowsEval2, getParsedType22 = (data) => {
66025
+ }), memories, memoryLinks, entities, entityTaxonomy, relationships, memoryEntities, init_memory, init_expressions2, exports_drizzle_orm, init_drizzle_orm, exports_streams, eventsTable, agentsTable, messagesTable, messageRecipientsTable, reservationsTable, locksTable, cursorsTable, evalRecordsTable, swarmContextsTable, decisionTracesTable, entityLinksTable, init_streams, exports_hive, beads, cells, cellEvents, beadLabels, cellLabels, beadComments, cellComments, beadDependencies, cellDependencies, blockedBeadsCache, dirtyBeads, schemaVersion, init_hive, exports_schema, init_schema, init_drizzle, require_entity, require_logger, require_query_promise, require_column, require_column_builder, require_table_utils, require_foreign_keys, require_tracing_utils, require_unique_constraint, require_array, require_common2, require_enum, require_subquery, require_version, require_tracing, require_view_common, require_table, require_sql, require_alias, require_selection_proxy, require_utils, require_delete, require_casing, require_errors, require_int_common, require_bigint, require_bigserial, require_boolean, require_char, require_cidr, require_custom, require_date_common, require_date, require_double_precision, require_inet, require_integer, require_interval, require_json, require_jsonb, require_line, require_macaddr, require_macaddr8, require_numeric, require_point, require_utils2, require_geometry, require_real, require_serial, require_smallint, require_smallserial, require_text, require_time, require_timestamp, require_uuid, require_varchar, require_bit, require_halfvec, require_sparsevec, require_vector, require_columns, require_all, require_table2, require_primary_keys, require_conditions, require_select, require_expressions, require_relations, require_aggregate, require_vector2, require_functions, require_sql2, require_view_base, require_dialect, require_query_builder, require_select2, require_query_builder2, require_insert, require_refresh_materialized_view, require_select_types, require_update, require_query_builders, require_count, require_query, require_raw, require_db, require_alias2, require_checks, require_indexes, require_policies, require_roles, require_sequence, require_view_common2, require_view, require_schema, require_session, require_subquery2, require_utils3, require_utils4, require_pg_core, require_session2, require_driver, require_pglite, exports_libsql_convenience, instances, init_libsql_convenience, exports_lock, DurableLock, DurableLockLive, init_lock, exports_reservation_utils, init_reservation_utils, init_projections_drizzle, exports_store_drizzle, init_store_drizzle, exports_swarm_mail, MAX_INBOX_LIMIT = 5, DEFAULT_TTL_SECONDS = 3600, ADJECTIVES, NOUNS, init_swarm_mail, MAX_INBOX_LIMIT2 = 5, DEFAULT_TTL_SECONDS2 = 3600, ADJECTIVES2, NOUNS2, init_agent_mail, exports_migrations, beadsMigration, cellsViewMigration, cellsViewMigrationLibSQL, beadsMigrationLibSQL, beadsResultColumnsMigration, beadsResultColumnsMigrationLibSQL, beadsMigrations, hiveMigrations, sessionsMigrationLibSQL, hiveMigrationsLibSQL, init_migrations, memoryMigration, memoryMigrationLibSQL, memorySchemaOverhaulLibSQL, sessionMetadataExtensionLibSQL, memorySelfHealColumnsLibSQL, memoryMigrations, memoryMigrationsLibSQL, init_migrations2, exports_migrations2, migrations, init_migrations3, urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", POOL_SIZE_MULTIPLIER = 128, pool, poolOffset, init_nanoid = () => {}, init_decision_trace_store, ClientBuffer, init_client_buffer, exports_streams2, SLOW_QUERY_THRESHOLD_MS = 100, init_streams2, exports_store, adapterCache, TIMESTAMP_SAFE_UNTIL, init_store, init_adapter, exports_dependencies_drizzle, MAX_DEPENDENCY_DEPTH = 100, init_dependencies_drizzle, exports_projections_drizzle, init_projections_drizzle2, exports_dependencies, MAX_DEPENDENCY_DEPTH2 = 100, init_store2, FIELD_SETS, init_pagination, marker = "vercel.ai.error", symbol6, _a, _b, AISDKError, name2 = "AI_APICallError", marker2, symbol222, _a2, _b2, APICallError, name22 = "AI_EmptyResponseBodyError", marker3, symbol32, _a3, _b3, EmptyResponseBodyError, name3 = "AI_InvalidArgumentError", marker4, symbol42, _a4, _b4, InvalidArgumentError, name4 = "AI_InvalidPromptError", marker5, symbol52, _a5, _b5, InvalidPromptError, name5 = "AI_InvalidResponseDataError", marker6, symbol62, _a6, _b6, InvalidResponseDataError, name6 = "AI_JSONParseError", marker7, symbol7, _a7, _b7, JSONParseError, name7 = "AI_LoadAPIKeyError", marker8, symbol8, _a8, _b8, LoadAPIKeyError, name8 = "AI_LoadSettingError", marker9, symbol9, _a9, _b9, LoadSettingError, name9 = "AI_NoContentGeneratedError", marker10, symbol10, _a10, _b10, NoContentGeneratedError, name10 = "AI_NoSuchModelError", marker11, symbol11, _a11, _b11, NoSuchModelError, name11 = "AI_TooManyEmbeddingValuesForCallError", marker12, symbol12, _a12, _b12, TooManyEmbeddingValuesForCallError, name12 = "AI_TypeValidationError", marker13, symbol13, _a13, _b13, TypeValidationError, name13 = "AI_UnsupportedFunctionalityError", marker14, symbol14, _a14, _b14, UnsupportedFunctionalityError, init_dist3, NEVER22, $brand2, $ZodAsyncError2, globalConfig2, init_core32, exports_util2, captureStackTrace2, allowsEval2, getParsedType22 = (data) => {
65986
66026
  const t = typeof data;
65987
66027
  switch (t) {
65988
66028
  case "undefined":
@@ -108406,14 +108446,14 @@ ${stack.split(`
108406
108446
  return interrupt2;
108407
108447
  } else if (this.targetSize > this.activeSize) {
108408
108448
  const self2 = this;
108409
- return flatMap12(this.resizeSemaphore.withPermitsIfAvailable(1)(forkIn2(interruptible2(this.resize), this.scope)), function loop() {
108449
+ return flatMap12(this.resizeSemaphore.withPermitsIfAvailable(1)(forkIn2(interruptible2(this.resize), this.scope)), function loop4() {
108410
108450
  if (self2.isShuttingDown) {
108411
108451
  return interrupt2;
108412
108452
  } else if (self2.available.size > 0) {
108413
108453
  return succeed(unsafeHead(self2.available));
108414
108454
  }
108415
108455
  self2.availableLatch.unsafeClose();
108416
- return flatMap12(self2.availableLatch.await, loop);
108456
+ return flatMap12(self2.availableLatch.await, loop4);
108417
108457
  });
108418
108458
  }
108419
108459
  return succeed(unsafeHead(this.available));
@@ -133719,9 +133759,212 @@ ${stack.split(`
133719
133759
  DROP INDEX IF EXISTS memories_content_idx;
133720
133760
  DROP INDEX IF EXISTS idx_memories_collection;
133721
133761
  DROP TABLE IF EXISTS memories;
133762
+ `
133763
+ };
133764
+ memoryMigrationLibSQL = {
133765
+ version: 9,
133766
+ description: "Add semantic memory tables (memories with vector support, FTS5)",
133767
+ up: `
133768
+ -- ========================================================================
133769
+ -- Memories Table
133770
+ -- ========================================================================
133771
+ CREATE TABLE IF NOT EXISTS memories (
133772
+ id TEXT PRIMARY KEY NOT NULL,
133773
+ content TEXT NOT NULL,
133774
+ metadata TEXT DEFAULT '{}',
133775
+ collection TEXT DEFAULT 'default',
133776
+ created_at TEXT DEFAULT (datetime('now')),
133777
+ confidence REAL DEFAULT 0.7,
133778
+ embedding F32_BLOB(1024)
133779
+ );
133780
+
133781
+ -- Collection filtering index
133782
+ CREATE INDEX IF NOT EXISTS idx_memories_collection ON memories(collection);
133783
+
133784
+ -- Vector embedding index for fast similarity search
133785
+ CREATE INDEX IF NOT EXISTS idx_memories_embedding ON memories(libsql_vector_idx(embedding));
133786
+
133787
+ -- ========================================================================
133788
+ -- FTS5 virtual table for full-text search
133789
+ -- ========================================================================
133790
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts
133791
+ USING fts5(id UNINDEXED, content, content=memories, content_rowid=rowid);
133792
+
133793
+ -- Triggers to keep FTS5 in sync
133794
+ CREATE TRIGGER IF NOT EXISTS memories_fts_insert
133795
+ AFTER INSERT ON memories
133796
+ BEGIN
133797
+ INSERT INTO memories_fts(rowid, id, content)
133798
+ VALUES (new.rowid, new.id, new.content);
133799
+ END;
133800
+
133801
+ CREATE TRIGGER IF NOT EXISTS memories_fts_update
133802
+ AFTER UPDATE ON memories
133803
+ BEGIN
133804
+ UPDATE memories_fts
133805
+ SET content = new.content
133806
+ WHERE rowid = new.rowid;
133807
+ END;
133808
+
133809
+ CREATE TRIGGER IF NOT EXISTS memories_fts_delete
133810
+ AFTER DELETE ON memories
133811
+ BEGIN
133812
+ DELETE FROM memories_fts WHERE rowid = old.rowid;
133813
+ END;
133814
+ `,
133815
+ down: `
133816
+ -- Drop in reverse order
133817
+ DROP TRIGGER IF EXISTS memories_fts_delete;
133818
+ DROP TRIGGER IF EXISTS memories_fts_update;
133819
+ DROP TRIGGER IF EXISTS memories_fts_insert;
133820
+ DROP TABLE IF EXISTS memories_fts;
133821
+ DROP INDEX IF EXISTS idx_memories_embedding;
133822
+ DROP INDEX IF EXISTS idx_memories_collection;
133823
+ DROP TABLE IF EXISTS memories;
133824
+ `
133825
+ };
133826
+ memorySchemaOverhaulLibSQL = {
133827
+ version: 10,
133828
+ description: "Memory schema overhaul: links, entities, relationships, temporal fields",
133829
+ up: `
133830
+ -- ========================================================================
133831
+ -- Add temporal and metadata columns to memories table
133832
+ -- ========================================================================
133833
+ ALTER TABLE memories ADD COLUMN valid_from TEXT;
133834
+ ALTER TABLE memories ADD COLUMN valid_until TEXT;
133835
+ ALTER TABLE memories ADD COLUMN superseded_by TEXT REFERENCES memories(id);
133836
+ ALTER TABLE memories ADD COLUMN auto_tags TEXT;
133837
+ ALTER TABLE memories ADD COLUMN keywords TEXT;
133838
+
133839
+ -- ========================================================================
133840
+ -- Memory Links Table (Zettelkasten-style bidirectional connections)
133841
+ -- ========================================================================
133842
+ CREATE TABLE IF NOT EXISTS memory_links (
133843
+ id TEXT PRIMARY KEY,
133844
+ source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
133845
+ target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
133846
+ link_type TEXT NOT NULL,
133847
+ strength REAL DEFAULT 1.0,
133848
+ created_at TEXT DEFAULT (datetime('now')),
133849
+ UNIQUE(source_id, target_id, link_type)
133850
+ );
133851
+
133852
+ CREATE INDEX IF NOT EXISTS idx_memory_links_source ON memory_links(source_id);
133853
+ CREATE INDEX IF NOT EXISTS idx_memory_links_target ON memory_links(target_id);
133854
+
133855
+ -- ========================================================================
133856
+ -- Entities Table (Named entities extracted from memories)
133857
+ -- ========================================================================
133858
+ CREATE TABLE IF NOT EXISTS entities (
133859
+ id TEXT PRIMARY KEY,
133860
+ name TEXT NOT NULL,
133861
+ entity_type TEXT NOT NULL,
133862
+ canonical_name TEXT,
133863
+ created_at TEXT DEFAULT (datetime('now')),
133864
+ updated_at TEXT DEFAULT (datetime('now')),
133865
+ UNIQUE(name, entity_type)
133866
+ );
133867
+
133868
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(entity_type);
133869
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
133870
+
133871
+ -- ========================================================================
133872
+ -- Relationships Table (Entity-entity triples)
133873
+ -- ========================================================================
133874
+ CREATE TABLE IF NOT EXISTS relationships (
133875
+ id TEXT PRIMARY KEY,
133876
+ subject_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
133877
+ predicate TEXT NOT NULL,
133878
+ object_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
133879
+ memory_id TEXT REFERENCES memories(id) ON DELETE SET NULL,
133880
+ confidence REAL DEFAULT 1.0,
133881
+ created_at TEXT DEFAULT (datetime('now')),
133882
+ UNIQUE(subject_id, predicate, object_id)
133883
+ );
133884
+
133885
+ CREATE INDEX IF NOT EXISTS idx_relationships_subject ON relationships(subject_id);
133886
+ CREATE INDEX IF NOT EXISTS idx_relationships_object ON relationships(object_id);
133887
+ CREATE INDEX IF NOT EXISTS idx_relationships_predicate ON relationships(predicate);
133888
+
133889
+ -- ========================================================================
133890
+ -- Memory-Entities Junction Table
133891
+ -- ========================================================================
133892
+ CREATE TABLE IF NOT EXISTS memory_entities (
133893
+ memory_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
133894
+ entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
133895
+ role TEXT,
133896
+ PRIMARY KEY(memory_id, entity_id)
133897
+ );
133898
+ `,
133899
+ down: `
133900
+ -- Drop tables in dependency order
133901
+ DROP TABLE IF EXISTS memory_entities;
133902
+ DROP TABLE IF EXISTS relationships;
133903
+ DROP INDEX IF EXISTS idx_memory_links_source;
133904
+ DROP INDEX IF EXISTS idx_memory_links_target;
133905
+ DROP TABLE IF EXISTS memory_links;
133906
+ DROP INDEX IF EXISTS idx_entities_type;
133907
+ DROP INDEX IF EXISTS idx_entities_name;
133908
+ DROP TABLE IF EXISTS entities;
133909
+
133910
+ -- Remove columns from memories table (SQLite doesn't support DROP COLUMN until 3.35.0)
133911
+ -- In production, these columns can be left as NULL if downgrade is needed
133912
+ -- Or recreate table without these columns
133913
+ `
133914
+ };
133915
+ sessionMetadataExtensionLibSQL = {
133916
+ version: 11,
133917
+ description: "Add session metadata columns (agent_type, session_id, message_role, message_idx, source_path)",
133918
+ up: `
133919
+ -- ========================================================================
133920
+ -- Add session metadata columns to memories table
133921
+ -- ========================================================================
133922
+ ALTER TABLE memories ADD COLUMN agent_type TEXT;
133923
+ ALTER TABLE memories ADD COLUMN session_id TEXT;
133924
+ ALTER TABLE memories ADD COLUMN message_role TEXT CHECK(message_role IN ('user', 'assistant', 'system'));
133925
+ ALTER TABLE memories ADD COLUMN message_idx INTEGER;
133926
+ ALTER TABLE memories ADD COLUMN source_path TEXT;
133927
+
133928
+ -- Index for session-based queries
133929
+ CREATE INDEX IF NOT EXISTS idx_memories_session ON memories(session_id, message_idx);
133930
+
133931
+ -- Index for agent filtering
133932
+ CREATE INDEX IF NOT EXISTS idx_memories_agent_type ON memories(agent_type);
133933
+
133934
+ -- Index for role filtering
133935
+ CREATE INDEX IF NOT EXISTS idx_memories_role ON memories(message_role);
133936
+ `,
133937
+ down: `
133938
+ -- Drop indexes first
133939
+ DROP INDEX IF EXISTS idx_memories_role;
133940
+ DROP INDEX IF EXISTS idx_memories_agent_type;
133941
+ DROP INDEX IF EXISTS idx_memories_session;
133942
+
133943
+ -- SQLite doesn't support DROP COLUMN until 3.35.0
133944
+ -- In production, these columns can be left as NULL if downgrade is needed
133945
+ -- Or recreate table without these columns
133946
+ `
133947
+ };
133948
+ memorySelfHealColumnsLibSQL = {
133949
+ version: 12,
133950
+ description: "Schema convergence: self-heal missing columns (tags, updated_at, decay_factor, access_count, last_accessed, category, status)",
133951
+ up: `
133952
+ -- No-op: actual column additions handled by healMemorySchema() post-migration.
133953
+ -- This migration just bumps the version number.
133954
+ SELECT 1;
133955
+ `,
133956
+ down: `
133957
+ -- Cannot remove columns in older SQLite versions
133958
+ SELECT 1;
133722
133959
  `
133723
133960
  };
133724
133961
  memoryMigrations = [memoryMigration];
133962
+ memoryMigrationsLibSQL = [
133963
+ memoryMigrationLibSQL,
133964
+ memorySchemaOverhaulLibSQL,
133965
+ sessionMetadataExtensionLibSQL,
133966
+ memorySelfHealColumnsLibSQL
133967
+ ];
133725
133968
  });
133726
133969
  exports_migrations2 = {};
133727
133970
  __export2(exports_migrations2, {
@@ -134061,7 +134304,7 @@ ${stack.split(`
134061
134304
  `
134062
134305
  },
134063
134306
  ...hiveMigrations,
134064
- ...memoryMigrations
134307
+ ...memoryMigrationsLibSQL
134065
134308
  ];
134066
134309
  });
134067
134310
  init_decision_trace_store = __esm2(() => {
@@ -151412,7 +151655,7 @@ var require_lib = __commonJS((exports, module) => {
151412
151655
  3793,
151413
151656
  7920
151414
151657
  ];
151415
- var toUTF8Array = function toUTF8Array(str2) {
151658
+ var toUTF8Array = function toUTF8Array2(str2) {
151416
151659
  var char2;
151417
151660
  var i = 0;
151418
151661
  var p = 0;
@@ -151439,7 +151682,7 @@ var require_lib = __commonJS((exports, module) => {
151439
151682
  }
151440
151683
  return utf8;
151441
151684
  };
151442
- var generate = module.exports = function generate(str2) {
151685
+ var generate = module.exports = function generate2(str2) {
151443
151686
  var char2;
151444
151687
  var i = 0;
151445
151688
  var start5 = -1;
@@ -152667,7 +152910,7 @@ WD9f
152667
152910
 
152668
152911
  // ../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/index.js
152669
152912
  var require_utils9 = __commonJS((exports) => {
152670
- var __dirname = "/Users/joel/Code/joelhooks/opencode-swarm-plugin/node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils";
152913
+ var __dirname = "/home/runner/work/swarm-tools/swarm-tools/node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils";
152671
152914
  Object.defineProperty(exports, "__esModule", { value: true });
152672
152915
  exports.noop = exports.defaults = exports.Debug = exports.getPackageMeta = exports.zipMap = exports.CONNECTION_CLOSED_ERROR_MSG = exports.shuffle = exports.sample = exports.resolveTLSProfile = exports.parseURL = exports.optimizeErrorStack = exports.toArg = exports.convertMapToArray = exports.convertObjectToArray = exports.timeout = exports.packObject = exports.isInt = exports.wrapMultiResult = exports.convertBufferToString = undefined;
152673
152916
  var fs_1 = __require("fs");
@@ -152953,7 +153196,7 @@ var require_argumentParsers = __commonJS((exports) => {
152953
153196
 
152954
153197
  // ../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/Command.js
152955
153198
  var require_Command = __commonJS((exports) => {
152956
- var __dirname = "/Users/joel/Code/joelhooks/opencode-swarm-plugin/node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built";
153199
+ var __dirname = "/home/runner/work/swarm-tools/swarm-tools/node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built";
152957
153200
  Object.defineProperty(exports, "__esModule", { value: true });
152958
153201
  var commands_1 = require_built();
152959
153202
  var calculateSlot = require_lib();
@@ -154506,10 +154749,10 @@ var require_denque = __commonJS((exports, module) => {
154506
154749
  i = this._head + i & this._capacityMask;
154507
154750
  return this._list[i];
154508
154751
  };
154509
- Denque.prototype.get = function get(i) {
154752
+ Denque.prototype.get = function get50(i) {
154510
154753
  return this.peekAt(i);
154511
154754
  };
154512
- Denque.prototype.peek = function peek() {
154755
+ Denque.prototype.peek = function peek5() {
154513
154756
  if (this._head === this._tail)
154514
154757
  return;
154515
154758
  return this._list[this._head];
@@ -154521,11 +154764,11 @@ var require_denque = __commonJS((exports, module) => {
154521
154764
  return this.peekAt(-1);
154522
154765
  };
154523
154766
  Object.defineProperty(Denque.prototype, "length", {
154524
- get: function length() {
154767
+ get: function length6() {
154525
154768
  return this.size();
154526
154769
  }
154527
154770
  });
154528
- Denque.prototype.size = function size() {
154771
+ Denque.prototype.size = function size40() {
154529
154772
  if (this._head === this._tail)
154530
154773
  return 0;
154531
154774
  if (this._head < this._tail)
@@ -154548,7 +154791,7 @@ var require_denque = __commonJS((exports, module) => {
154548
154791
  else
154549
154792
  return this._capacityMask + 1 - (this._head - this._tail);
154550
154793
  };
154551
- Denque.prototype.shift = function shift() {
154794
+ Denque.prototype.shift = function shift2() {
154552
154795
  var head13 = this._head;
154553
154796
  if (head13 === this._tail)
154554
154797
  return;
@@ -154576,7 +154819,7 @@ var require_denque = __commonJS((exports, module) => {
154576
154819
  else
154577
154820
  return this._capacityMask + 1 - (this._head - this._tail);
154578
154821
  };
154579
- Denque.prototype.pop = function pop() {
154822
+ Denque.prototype.pop = function pop3() {
154580
154823
  var tail5 = this._tail;
154581
154824
  if (tail5 === this._head)
154582
154825
  return;
@@ -154619,7 +154862,7 @@ var require_denque = __commonJS((exports, module) => {
154619
154862
  }
154620
154863
  return item;
154621
154864
  };
154622
- Denque.prototype.remove = function remove(index3, count10) {
154865
+ Denque.prototype.remove = function remove22(index3, count10) {
154623
154866
  var i = index3;
154624
154867
  var removed;
154625
154868
  var del_count = count10;
@@ -154758,15 +155001,15 @@ var require_denque = __commonJS((exports, module) => {
154758
155001
  return this.remove(i, count10);
154759
155002
  }
154760
155003
  };
154761
- Denque.prototype.clear = function clear() {
155004
+ Denque.prototype.clear = function clear8() {
154762
155005
  this._list = new Array(this._list.length);
154763
155006
  this._head = 0;
154764
155007
  this._tail = 0;
154765
155008
  };
154766
- Denque.prototype.isEmpty = function isEmpty() {
155009
+ Denque.prototype.isEmpty = function isEmpty32() {
154767
155010
  return this._head === this._tail;
154768
155011
  };
154769
- Denque.prototype.toArray = function toArray() {
155012
+ Denque.prototype.toArray = function toArray12() {
154770
155013
  return this._copyArray(false);
154771
155014
  };
154772
155015
  Denque.prototype._fromArray = function _fromArray(array11) {
@@ -159196,7 +159439,7 @@ var require_is_extendable = __commonJS((exports, module) => {
159196
159439
  // ../../node_modules/.bun/extend-shallow@2.0.1/node_modules/extend-shallow/index.js
159197
159440
  var require_extend_shallow = __commonJS((exports, module) => {
159198
159441
  var isObject4 = require_is_extendable();
159199
- module.exports = function extend(o) {
159442
+ module.exports = function extend7(o) {
159200
159443
  if (!isObject4(o)) {
159201
159444
  o = {};
159202
159445
  }
@@ -159390,7 +159633,7 @@ var require_exception = __commonJS((exports, module) => {
159390
159633
  }
159391
159634
  YAMLException.prototype = Object.create(Error.prototype);
159392
159635
  YAMLException.prototype.constructor = YAMLException;
159393
- YAMLException.prototype.toString = function toString(compact7) {
159636
+ YAMLException.prototype.toString = function toString2(compact7) {
159394
159637
  var result = this.name + ": ";
159395
159638
  result += this.reason || "(unknown reason)";
159396
159639
  if (!compact7 && this.mark) {
@@ -159443,7 +159686,7 @@ var require_mark = __commonJS((exports, module) => {
159443
159686
  return common.repeat(" ", indent) + head13 + snippet + tail5 + `
159444
159687
  ` + common.repeat(" ", indent + this.position - start5 + head13.length) + "^";
159445
159688
  };
159446
- Mark.prototype.toString = function toString(compact7) {
159689
+ Mark.prototype.toString = function toString2(compact7) {
159447
159690
  var snippet, where = "";
159448
159691
  if (this.name) {
159449
159692
  where += 'in "' + this.name + '" ';
@@ -194204,7 +194447,7 @@ var require_node_gyp_build_optional_packages = __commonJS((exports, module) => {
194204
194447
 
194205
194448
  // ../../node_modules/.bun/msgpackr-extract@3.0.3/node_modules/msgpackr-extract/index.js
194206
194449
  var require_msgpackr_extract = __commonJS((exports, module) => {
194207
- var __dirname = "/Users/joel/Code/joelhooks/opencode-swarm-plugin/node_modules/.bun/msgpackr-extract@3.0.3/node_modules/msgpackr-extract";
194450
+ var __dirname = "/home/runner/work/swarm-tools/swarm-tools/node_modules/.bun/msgpackr-extract@3.0.3/node_modules/msgpackr-extract";
194208
194451
  module.exports = require_node_gyp_build_optional_packages()(__dirname);
194209
194452
  });
194210
194453
 
@@ -194738,7 +194981,7 @@ var require_node5 = __commonJS((exports) => {
194738
194981
  readString16 = readString2(3);
194739
194982
  readString32 = readString2(5);
194740
194983
  function readString2(headerLength) {
194741
- return function readString(length7) {
194984
+ return function readString3(length7) {
194742
194985
  let string13 = strings[stringPosition++];
194743
194986
  if (string13 == null) {
194744
194987
  if (bundledStrings$1)
@@ -213645,7 +213888,7 @@ var require_expression = __commonJS((exports, module) => {
213645
213888
  this._hasIterated = true;
213646
213889
  return currentDate;
213647
213890
  };
213648
- CronExpression.prototype.next = function next() {
213891
+ CronExpression.prototype.next = function next6() {
213649
213892
  var schedule5 = this._findSchedule();
213650
213893
  if (this._isIterator) {
213651
213894
  return {
@@ -213691,7 +213934,7 @@ var require_expression = __commonJS((exports, module) => {
213691
213934
  this._hasIterated = hasIterated;
213692
213935
  }
213693
213936
  };
213694
- CronExpression.prototype.iterate = function iterate(steps, callback) {
213937
+ CronExpression.prototype.iterate = function iterate8(steps, callback) {
213695
213938
  var dates = [];
213696
213939
  if (steps >= 0) {
213697
213940
  for (var i = 0, c = steps;i < c; i++) {
@@ -213720,10 +213963,10 @@ var require_expression = __commonJS((exports, module) => {
213720
213963
  }
213721
213964
  return dates;
213722
213965
  };
213723
- CronExpression.prototype.reset = function reset(newDate) {
213966
+ CronExpression.prototype.reset = function reset3(newDate) {
213724
213967
  this._currentDate = new CronDate(newDate || this._options.currentDate);
213725
213968
  };
213726
- CronExpression.prototype.stringify = function stringify(includeSeconds) {
213969
+ CronExpression.prototype.stringify = function stringify3(includeSeconds) {
213727
213970
  var resultArr = [];
213728
213971
  for (var i = includeSeconds ? 0 : 1, c = CronExpression.map.length;i < c; ++i) {
213729
213972
  var field = CronExpression.map[i];
@@ -213739,12 +213982,12 @@ var require_expression = __commonJS((exports, module) => {
213739
213982
  }
213740
213983
  return resultArr.join(" ");
213741
213984
  };
213742
- CronExpression.parse = function parse(expression, options2) {
213985
+ CronExpression.parse = function parse8(expression, options2) {
213743
213986
  var self2 = this;
213744
213987
  if (typeof options2 === "function") {
213745
213988
  options2 = {};
213746
213989
  }
213747
- function parse8(expression2, options3) {
213990
+ function parse9(expression2, options3) {
213748
213991
  if (!options3) {
213749
213992
  options3 = {};
213750
213993
  }
@@ -213800,7 +214043,7 @@ var require_expression = __commonJS((exports, module) => {
213800
214043
  return val2;
213801
214044
  }
213802
214045
  }
213803
- return parse8(expression, options2);
214046
+ return parse9(expression, options2);
213804
214047
  };
213805
214048
  CronExpression.fieldsToExpression = function fieldsToExpression(fields, options2) {
213806
214049
  function validateConstraints(field2, values19, constraints) {
@@ -215474,7 +215717,7 @@ var require_sandbox = __commonJS((exports) => {
215474
215717
  Object.defineProperty(exports, "__esModule", { value: true });
215475
215718
  var enums_1 = require_enums();
215476
215719
  var sandbox5 = (processFile, childPool) => {
215477
- return async function process(job, token) {
215720
+ return async function process3(job, token) {
215478
215721
  let child;
215479
215722
  let msgHandler;
215480
215723
  let exitHandler;
@@ -217357,7 +217600,7 @@ var require_redact = __commonJS((exports, module) => {
217357
217600
  } = options2;
217358
217601
  validatePaths(paths);
217359
217602
  const pathStructure = buildPathStructure(paths);
217360
- return function redact(obj) {
217603
+ return function redact3(obj) {
217361
217604
  if (strict3 && (obj === null || typeof obj !== "object")) {
217362
217605
  if (obj === null || obj === undefined) {
217363
217606
  return serialize2 ? serialize2(obj) : obj;
@@ -218507,7 +218750,7 @@ var require_indexes2 = __commonJS((exports, module) => {
218507
218750
 
218508
218751
  // ../../node_modules/.bun/thread-stream@3.1.0/node_modules/thread-stream/index.js
218509
218752
  var require_thread_stream = __commonJS((exports, module) => {
218510
- var __dirname = "/Users/joel/Code/joelhooks/opencode-swarm-plugin/node_modules/.bun/thread-stream@3.1.0/node_modules/thread-stream";
218753
+ var __dirname = "/home/runner/work/swarm-tools/swarm-tools/node_modules/.bun/thread-stream@3.1.0/node_modules/thread-stream";
218511
218754
  var { version: version5 } = require_package();
218512
218755
  var { EventEmitter: EventEmitter4 } = __require("events");
218513
218756
  var { Worker: Worker3 } = __require("worker_threads");
@@ -218928,7 +219171,7 @@ var require_thread_stream = __commonJS((exports, module) => {
218928
219171
 
218929
219172
  // ../../node_modules/.bun/pino@9.14.0/node_modules/pino/lib/transport.js
218930
219173
  var require_transport = __commonJS((exports, module) => {
218931
- var __dirname = "/Users/joel/Code/joelhooks/opencode-swarm-plugin/node_modules/.bun/pino@9.14.0/node_modules/pino/lib";
219174
+ var __dirname = "/home/runner/work/swarm-tools/swarm-tools/node_modules/.bun/pino@9.14.0/node_modules/pino/lib";
218932
219175
  var { createRequire: createRequire3 } = __require("module");
218933
219176
  var getCallers = require_caller();
218934
219177
  var { join: join18, isAbsolute: isAbsolute3, sep: sep4 } = __require("node:path");
@@ -6291,7 +6291,7 @@ var require_formats = __commonJS((exports2) => {
6291
6291
  }
6292
6292
  var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;
6293
6293
  function getTime(strictTimeZone) {
6294
- return function time(str) {
6294
+ return function time3(str) {
6295
6295
  const matches = TIME.exec(str);
6296
6296
  if (!matches)
6297
6297
  return false;