@heretek-ai/epistemic-swarm 0.7.19 → 0.7.20

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 (78) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/package.json +1 -1
  3. package/plugins/antigravity/plugin.json +1 -1
  4. package/plugins/opencode/config-io.js +55 -12
  5. package/plugins/opencode/index.js +606 -0
  6. package/plugins/opencode/tui.js +262 -6
  7. package/runner/__pycache__/__init__.cpython-311.pyc +0 -0
  8. package/runner/__pycache__/auctioneer.cpython-311.pyc +0 -0
  9. package/runner/__pycache__/auditor_engine.cpython-311.pyc +0 -0
  10. package/runner/__pycache__/claim_store.cpython-311.pyc +0 -0
  11. package/runner/__pycache__/claim_witness.cpython-311.pyc +0 -0
  12. package/runner/__pycache__/darkharvest_claims.cpython-311.pyc +0 -0
  13. package/runner/__pycache__/errors.cpython-311.pyc +0 -0
  14. package/runner/__pycache__/living_dossiers.cpython-311.pyc +0 -0
  15. package/runner/__pycache__/mcp_protocol.cpython-311.pyc +0 -0
  16. package/runner/__pycache__/mcp_server.cpython-311.pyc +0 -0
  17. package/runner/__pycache__/path_safety.cpython-311.pyc +0 -0
  18. package/runner/__pycache__/pcrb.cpython-311.pyc +0 -0
  19. package/runner/__pycache__/pcrb_verify.cpython-311.pyc +0 -0
  20. package/runner/__pycache__/preflight.cpython-311.pyc +0 -0
  21. package/runner/__pycache__/refinement.cpython-311.pyc +0 -0
  22. package/runner/__pycache__/research_swarm.cpython-311.pyc +0 -0
  23. package/runner/__pycache__/retrieval_log.cpython-311.pyc +0 -0
  24. package/runner/__pycache__/schema_validate.cpython-311.pyc +0 -0
  25. package/runner/__pycache__/schemas.cpython-311.pyc +0 -0
  26. package/runner/__pycache__/state_machine.cpython-311.pyc +0 -0
  27. package/runner/mcp_server.py +37 -4
  28. package/runner/research_swarm.py +12 -2
  29. package/runner/schemas.py +18 -0
  30. package/runner/tests/__pycache__/test_antigravity_plugin.cpython-311.pyc +0 -0
  31. package/runner/tests/__pycache__/test_auction_order.cpython-311.pyc +0 -0
  32. package/runner/tests/__pycache__/test_backends.cpython-311.pyc +0 -0
  33. package/runner/tests/__pycache__/test_bet1_spike.cpython-311.pyc +0 -0
  34. package/runner/tests/__pycache__/test_claim_store.cpython-311.pyc +0 -0
  35. package/runner/tests/__pycache__/test_claim_witness.cpython-311.pyc +0 -0
  36. package/runner/tests/__pycache__/test_claude_plugin.cpython-311.pyc +0 -0
  37. package/runner/tests/__pycache__/test_config_schema.cpython-311.pyc +0 -0
  38. package/runner/tests/__pycache__/test_contract_tooling.cpython-311.pyc +0 -0
  39. package/runner/tests/__pycache__/test_darkharvest_audit.cpython-311.pyc +0 -0
  40. package/runner/tests/__pycache__/test_domain_packs.cpython-311.pyc +0 -0
  41. package/runner/tests/__pycache__/test_dossier_contract.cpython-311.pyc +0 -0
  42. package/runner/tests/__pycache__/test_factory.cpython-311.pyc +0 -0
  43. package/runner/tests/__pycache__/test_fleet_seam.cpython-311.pyc +0 -0
  44. package/runner/tests/__pycache__/test_frontier_concurrency.cpython-311.pyc +0 -0
  45. package/runner/tests/__pycache__/test_frontier_mirror_standalone.cpython-311.pyc +0 -0
  46. package/runner/tests/__pycache__/test_grounding.cpython-311.pyc +0 -0
  47. package/runner/tests/__pycache__/test_living_dossiers.cpython-311.pyc +0 -0
  48. package/runner/tests/__pycache__/test_manifest_concurrency.cpython-311.pyc +0 -0
  49. package/runner/tests/__pycache__/test_mcp_server.cpython-311.pyc +0 -0
  50. package/runner/tests/__pycache__/test_opencode_ux.cpython-311.pyc +0 -0
  51. package/runner/tests/__pycache__/test_opencode_v2_registrars.cpython-311.pyc +0 -0
  52. package/runner/tests/__pycache__/test_pcrb.cpython-311.pyc +0 -0
  53. package/runner/tests/__pycache__/test_refinement.cpython-311.pyc +0 -0
  54. package/runner/tests/__pycache__/test_search_anomaly.cpython-311.pyc +0 -0
  55. package/runner/tests/__pycache__/test_search_provider.cpython-311.pyc +0 -0
  56. package/runner/tests/__pycache__/test_search_provider_plugin.cpython-311.pyc +0 -0
  57. package/runner/tests/__pycache__/test_swarm.cpython-311.pyc +0 -0
  58. package/runner/tests/__pycache__/test_swarm_config.cpython-311.pyc +0 -0
  59. package/runner/tests/__pycache__/test_sweep_regressions.cpython-311.pyc +0 -0
  60. package/runner/tests/__pycache__/test_webcache.cpython-311.pyc +0 -0
  61. package/runner/tests/test_config_schema.py +41 -0
  62. package/runner/tests/test_opencode_ux.py +342 -7
  63. package/runner/tests/test_opencode_v2_registrars.py +1061 -3
  64. package/runner/tests/test_swarm_config.py +21 -0
  65. package/schemas/config.schema.json +11 -0
  66. package/scripts/__pycache__/bet1_advisory_spike.cpython-311.pyc +0 -0
  67. package/scripts/__pycache__/build_adapters.cpython-311.pyc +0 -0
  68. package/scripts/__pycache__/check_docs.cpython-311.pyc +0 -0
  69. package/scripts/__pycache__/divergence_experiment.cpython-311.pyc +0 -0
  70. package/scripts/__pycache__/gen_schemas.cpython-311.pyc +0 -0
  71. package/skills/epistemic_search/scripts/__pycache__/search.cpython-311.pyc +0 -0
  72. package/skills/grilling/__pycache__/__init__.cpython-311.pyc +0 -0
  73. package/skills/grilling/__pycache__/socratic_tree.cpython-311.pyc +0 -0
  74. package/skills/research_cache/__pycache__/__init__.cpython-311.pyc +0 -0
  75. package/skills/research_cache/__pycache__/hasher.cpython-311.pyc +0 -0
  76. package/skills/swarm_config/__pycache__/__init__.cpython-311.pyc +0 -0
  77. package/skills/swarm_config/__pycache__/configure.cpython-311.pyc +0 -0
  78. package/skills/swarm_config/configure.py +5 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epistemic-swarm",
3
- "version": "0.7.19",
3
+ "version": "0.7.20",
4
4
  "description": "High-Integrity Dialectic Research Agent Harness for Claude Code enforcing empirical evidence over parametric hallucination.",
5
5
  "author": {
6
6
  "name": "Heretek AI",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heretek-ai/epistemic-swarm",
3
- "version": "0.7.19",
3
+ "version": "0.7.20",
4
4
  "description": "IUMBTEMS (Epistemic Swarm) \u2014 High-Integrity Dialectic Research Agent Harness for Claude Code, OpenCode V2, Pi (pi.dev), OMP (oh-my-pi), Gemini CLI, Codex CLI, and AntiGravity",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "epistemic-swarm",
4
- "version": "0.7.19",
4
+ "version": "0.7.20",
5
5
  "description": "IUMBTEMS (Epistemic Swarm) \u2014 High-Integrity Dialectic Research, Architecture Auditing, Competitor Teardowns, and Socratic Planning for Antigravity.",
6
6
  "author": {
7
7
  "name": "Heretek AI",
@@ -429,6 +429,7 @@ export const FALLBACK_DEFAULTS = {
429
429
  },
430
430
  opencode_auto: null,
431
431
  opencode_agent: null,
432
+ mcp_servers: {},
432
433
  };
433
434
 
434
435
  /** Effective defaults, derived from the schema `default` keywords. */
@@ -589,6 +590,58 @@ export function isConfigMalformed(baseDir = DEFAULT_RESEARCH_DIR) {
589
590
  }
590
591
  }
591
592
 
593
+ /**
594
+ * Single-read snapshot of the config file (phase-03 R5): the raw bytes are
595
+ * read EXACTLY ONCE; `hash` is computed over those bytes and `raw` is parsed
596
+ * from those bytes, so a config parsed from one era can never pair with a
597
+ * hash of another. `malformed` is true when bytes exist but are not a JSON
598
+ * object. Never throws, never writes, never creates directories.
599
+ */
600
+ export function readConfigSnapshot(baseDir = DEFAULT_RESEARCH_DIR) {
601
+ try {
602
+ const bytes = readBytes(getConfigPath(baseDir));
603
+ if (!bytes) return { hash: null, raw: null, malformed: false };
604
+ let hash = null;
605
+ try {
606
+ hash = createHash('sha256').update(bytes).digest('hex');
607
+ } catch {
608
+ hash = null;
609
+ }
610
+ const raw = parseJsonObject(bytes);
611
+ return { hash, raw, malformed: raw === null };
612
+ } catch {
613
+ return { hash: null, raw: null, malformed: false };
614
+ }
615
+ }
616
+
617
+ /**
618
+ * Effective config merged over defaults from an already-parsed raw object —
619
+ * the no-reread half of `loadConfig` (identical merge, migration, and
620
+ * fallback semantics; the caller owns the bytes). Never throws.
621
+ */
622
+ export function loadConfigFromRaw(raw) {
623
+ try {
624
+ const base = configDefaults();
625
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return base;
626
+ const merged = { ...base, ...deepCopy(raw) };
627
+ merged.agents = mergeAgents(base.agents, raw.agents);
628
+ if (
629
+ raw.verify && typeof raw.verify === 'object' && !Array.isArray(raw.verify) &&
630
+ base.verify && typeof base.verify === 'object' && !Array.isArray(base.verify)
631
+ ) {
632
+ merged.verify = { ...base.verify, ...deepCopy(raw.verify) };
633
+ }
634
+ migrateLegacyAgentBackends(merged);
635
+ return merged;
636
+ } catch {
637
+ try {
638
+ return deepCopy(FALLBACK_DEFAULTS);
639
+ } catch {
640
+ return {};
641
+ }
642
+ }
643
+ }
644
+
592
645
  /**
593
646
  * Load config merged over defaults. Pure — never writes. Applies the
594
647
  * legacy-pin migration in memory; unknown keys are preserved verbatim.
@@ -596,7 +649,6 @@ export function isConfigMalformed(baseDir = DEFAULT_RESEARCH_DIR) {
596
649
  */
597
650
  export function loadConfig(baseDir = DEFAULT_RESEARCH_DIR) {
598
651
  try {
599
- const base = configDefaults();
600
652
  const raw = readRawConfig(baseDir);
601
653
  if (!raw) {
602
654
  if (isConfigMalformed(baseDir)) {
@@ -609,18 +661,9 @@ export function loadConfig(baseDir = DEFAULT_RESEARCH_DIR) {
609
661
  /* logging must never throw */
610
662
  }
611
663
  }
612
- return base;
664
+ return configDefaults();
613
665
  }
614
- const merged = { ...base, ...deepCopy(raw) };
615
- merged.agents = mergeAgents(base.agents, raw.agents);
616
- if (
617
- raw.verify && typeof raw.verify === 'object' && !Array.isArray(raw.verify) &&
618
- base.verify && typeof base.verify === 'object' && !Array.isArray(base.verify)
619
- ) {
620
- merged.verify = { ...base.verify, ...deepCopy(raw.verify) };
621
- }
622
- migrateLegacyAgentBackends(merged);
623
- return merged;
666
+ return loadConfigFromRaw(raw);
624
667
  } catch {
625
668
  try {
626
669
  return deepCopy(FALLBACK_DEFAULTS);