insika 0.2.0 → 0.7.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 (300) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +325 -17
  3. data/README.md +52 -11
  4. data/bin/insika +895 -8
  5. data/bin/insika-router +87 -0
  6. data/docs/AGENTS.md +229 -163
  7. data/docs/API.md +56 -0
  8. data/docs/ARCHITECTURE.md +3 -2
  9. data/docs/ARTIFACTS.md +95 -0
  10. data/docs/BENCHMARK.md +2 -2
  11. data/docs/CHANNELS.md +111 -21
  12. data/docs/CONTEXT.md +132 -19
  13. data/docs/DEMO.md +80 -0
  14. data/docs/DEPLOY.md +75 -4
  15. data/docs/EMBEDDING.md +1 -1
  16. data/docs/EVALS.md +146 -2
  17. data/docs/FACTS.md +135 -0
  18. data/docs/HARVEST.md +116 -0
  19. data/docs/KNOWLEDGE.md +290 -0
  20. data/docs/LOADTEST.md +16 -10
  21. data/docs/MEDIA.md +128 -0
  22. data/docs/OBSERVABILITY.md +65 -6
  23. data/docs/OUTCOMES.md +137 -0
  24. data/docs/PLUGINS.md +51 -6
  25. data/docs/POLICY.md +216 -0
  26. data/docs/REFINEMENT.md +17 -12
  27. data/docs/RELEASING.md +27 -0
  28. data/docs/ROUTER.md +213 -0
  29. data/docs/RUNNING-LOCAL.md +6 -6
  30. data/docs/SCHEDULING.md +121 -0
  31. data/docs/SECURITY.md +79 -2
  32. data/docs/SKILLS.md +13 -4
  33. data/docs/SOAK.md +127 -0
  34. data/docs/TEMPLATES.md +134 -0
  35. data/docs/TOOLS.md +220 -27
  36. data/docs/WHY.md +1 -1
  37. data/docs/WORKFLOWS.md +2 -2
  38. data/docs/_includes/head_custom.html +5 -0
  39. data/docs/_includes/title.html +13 -0
  40. data/docs/_sass/color_schemes/insika.scss +32 -0
  41. data/docs/_sass/custom/custom.scss +199 -0
  42. data/docs/_sass/custom/setup.scss +26 -0
  43. data/docs/assets/img/favicon.svg +7 -0
  44. data/docs/assets/img/insika-mark.svg +7 -0
  45. data/docs/core-concepts.md +21 -0
  46. data/docs/domain.md +115 -0
  47. data/docs/improve.md +20 -0
  48. data/docs/index.md +9 -6
  49. data/docs/integrate.md +20 -0
  50. data/docs/operate.md +13 -6
  51. data/docs/prompts/ADD-TOOL.md +118 -0
  52. data/docs/prompts/DIAGNOSE-TURN.md +65 -0
  53. data/docs/prompts/GO-LIVE.md +138 -0
  54. data/docs/prompts/RUN-EXAMPLES.md +70 -0
  55. data/docs/reference.md +19 -0
  56. data/docs/ship.md +10 -2
  57. data/docs/start-here.md +18 -0
  58. data/lib/insika/agent_profile.rb +202 -10
  59. data/lib/insika/artifact_signing.rb +82 -0
  60. data/lib/insika/artifact_store.rb +160 -0
  61. data/lib/insika/balloon_splitter.rb +102 -0
  62. data/lib/insika/budget_ledger.rb +34 -3
  63. data/lib/insika/cache_series_store.rb +49 -0
  64. data/lib/insika/channel_delivery.rb +119 -14
  65. data/lib/insika/channels/relay.rb +77 -3
  66. data/lib/insika/channels/web.rb +2 -2
  67. data/lib/insika/chat_builder.rb +105 -2
  68. data/lib/insika/checkpoint_store.rb +16 -0
  69. data/lib/insika/commands/agent_payload.rb +3 -3
  70. data/lib/insika/commands/backfill_knowledge.rb +145 -0
  71. data/lib/insika/commands/cancel_followup.rb +49 -0
  72. data/lib/insika/commands/delete_artifact.rb +35 -0
  73. data/lib/insika/commands/delete_concept.rb +34 -0
  74. data/lib/insika/commands/delete_mcp.rb +6 -2
  75. data/lib/insika/commands/delete_tenant_data.rb +107 -0
  76. data/lib/insika/commands/export_customer_memory.rb +48 -0
  77. data/lib/insika/commands/forget_customer.rb +117 -0
  78. data/lib/insika/commands/freeze_funnel_baseline.rb +113 -0
  79. data/lib/insika/commands/gate_harvest.rb +138 -0
  80. data/lib/insika/commands/gate_refinement.rb +1 -1
  81. data/lib/insika/commands/judge_shadow_pairs.rb +124 -0
  82. data/lib/insika/commands/memory_forget_fact.rb +20 -4
  83. data/lib/insika/commands/memory_put_fact.rb +23 -4
  84. data/lib/insika/commands/promote_harvest.rb +130 -0
  85. data/lib/insika/commands/record_outcome.rb +46 -0
  86. data/lib/insika/commands/record_shadow_reply.rb +68 -0
  87. data/lib/insika/commands/refresh_mcp_tools.rb +47 -0
  88. data/lib/insika/commands/reject_harvest.rb +38 -0
  89. data/lib/insika/commands/resolve_proposal.rb +108 -0
  90. data/lib/insika/commands/restore_concept.rb +34 -0
  91. data/lib/insika/commands/revoke_contact.rb +49 -0
  92. data/lib/insika/commands/rollback_harvest.rb +86 -0
  93. data/lib/insika/commands/run_distillation.rb +186 -0
  94. data/lib/insika/commands/run_harvest.rb +393 -0
  95. data/lib/insika/commands/seed_demo_data.rb +31 -0
  96. data/lib/insika/commands/send_message.rb +103 -6
  97. data/lib/insika/commands/session_purge.rb +67 -0
  98. data/lib/insika/commands/upsert_mcp.rb +6 -3
  99. data/lib/insika/commands/write_concept.rb +57 -0
  100. data/lib/insika/contact_store.rb +183 -0
  101. data/lib/insika/context/builder.rb +21 -3
  102. data/lib/insika/context/fragment.rb +7 -3
  103. data/lib/insika/context/priority.rb +5 -0
  104. data/lib/insika/context/provider.rb +17 -3
  105. data/lib/insika/context/providers/briefing.rb +96 -0
  106. data/lib/insika/context/providers/knowledge.rb +108 -0
  107. data/lib/insika/context/providers/memory.rb +16 -7
  108. data/lib/insika/context/providers/prompt.rb +57 -23
  109. data/lib/insika/context/providers/skill.rb +2 -0
  110. data/lib/insika/context/providers/tool_search.rb +2 -0
  111. data/lib/insika/context_trace_store.rb +38 -2
  112. data/lib/insika/cron.rb +189 -0
  113. data/lib/insika/demo/agent_attrs.rb +43 -0
  114. data/lib/insika/demo/golden_cases.rb +81 -0
  115. data/lib/insika/demo/seeder.rb +336 -0
  116. data/lib/insika/distill.rb +224 -0
  117. data/lib/insika/distill_engine.rb +169 -0
  118. data/lib/insika/doctor.rb +889 -11
  119. data/lib/insika/dsl/definition.rb +3 -2
  120. data/lib/insika/dsl/runtime.rb +69 -82
  121. data/lib/insika/dsl/server_boot.rb +92 -1
  122. data/lib/insika/dsl/system.rb +10 -2
  123. data/lib/insika/dsl.rb +186 -5
  124. data/lib/insika/edge_limiter.rb +28 -7
  125. data/lib/insika/env_schema.rb +25 -3
  126. data/lib/insika/errors.rb +11 -0
  127. data/lib/insika/evals/assertions.rb +3 -2
  128. data/lib/insika/evals/golden.rb +41 -4
  129. data/lib/insika/evals/judge.rb +47 -2
  130. data/lib/insika/evals/pairwise.rb +29 -6
  131. data/lib/insika/evals/persona.rb +98 -0
  132. data/lib/insika/evals/runner.rb +9 -0
  133. data/lib/insika/evals/simulator.rb +225 -0
  134. data/lib/insika/evals/transport.rb +83 -1
  135. data/lib/insika/event_stream.rb +10 -0
  136. data/lib/insika/evidence.rb +183 -0
  137. data/lib/insika/executor.rb +869 -76
  138. data/lib/insika/followup_engine.rb +207 -0
  139. data/lib/insika/followup_policy.rb +198 -0
  140. data/lib/insika/followup_store.rb +306 -0
  141. data/lib/insika/funnel_declaration.rb +106 -0
  142. data/lib/insika/funnel_fold.rb +179 -0
  143. data/lib/insika/funnel_store.rb +163 -0
  144. data/lib/insika/golden_store.rb +17 -2
  145. data/lib/insika/grounding/matcher.rb +69 -0
  146. data/lib/insika/grounding.rb +44 -0
  147. data/lib/insika/harvest/conversion_gate.rb +159 -0
  148. data/lib/insika/harvest/criterion.rb +98 -0
  149. data/lib/insika/harvest/gate.rb +194 -0
  150. data/lib/insika/harvest/negative_list.rb +199 -0
  151. data/lib/insika/harvest.rb +241 -0
  152. data/lib/insika/harvest_engine.rb +193 -0
  153. data/lib/insika/harvest_store.rb +548 -0
  154. data/lib/insika/knowledge.rb +680 -0
  155. data/lib/insika/knowledge_store.rb +140 -0
  156. data/lib/insika/mcp_client.rb +94 -0
  157. data/lib/insika/mcp_json.rb +74 -0
  158. data/lib/insika/mcp_live_tool.rb +43 -0
  159. data/lib/insika/mcp_store.rb +98 -26
  160. data/lib/insika/mcp_tool_ingestor.rb +30 -8
  161. data/lib/insika/mcp_tool_registry.rb +100 -0
  162. data/lib/insika/media.rb +382 -0
  163. data/lib/insika/memory_audit_store.rb +85 -0
  164. data/lib/insika/memory_store.rb +264 -23
  165. data/lib/insika/message_origin.rb +7 -2
  166. data/lib/insika/middleware.rb +9 -0
  167. data/lib/insika/model_visible.rb +87 -0
  168. data/lib/insika/model_visible_trace_store.rb +66 -0
  169. data/lib/insika/onboarding.rb +22 -1
  170. data/lib/insika/outbox_store.rb +42 -4
  171. data/lib/insika/outcome_store.rb +147 -0
  172. data/lib/insika/overlay_tool_registry.rb +37 -17
  173. data/lib/insika/packaging.rb +163 -0
  174. data/lib/insika/parity/criterion.rb +79 -0
  175. data/lib/insika/parity/verdict.rb +318 -0
  176. data/lib/insika/prefix_fingerprint.rb +58 -0
  177. data/lib/insika/profile_source.rb +29 -1
  178. data/lib/insika/prompt_catalog.rb +10 -0
  179. data/lib/insika/proposal_store.rb +271 -0
  180. data/lib/insika/queue_policy.rb +4 -1
  181. data/lib/insika/refinement/proposer.rb +1 -1
  182. data/lib/insika/reliability.rb +32 -6
  183. data/lib/insika/retention.rb +316 -0
  184. data/lib/insika/router/app.rb +157 -0
  185. data/lib/insika/router/backend_pool.rb +98 -0
  186. data/lib/insika/router/hash_ring.rb +55 -0
  187. data/lib/insika/router/proxy_body.rb +34 -0
  188. data/lib/insika/router/session_key.rb +54 -0
  189. data/lib/insika/router.rb +18 -0
  190. data/lib/insika/routing.rb +101 -0
  191. data/lib/insika/safety/config.rb +44 -4
  192. data/lib/insika/safety/corpus.rb +255 -0
  193. data/lib/insika/safety/detectors.rb +32 -113
  194. data/lib/insika/safety/factory.rb +15 -2
  195. data/lib/insika/safety/grounding_enforcer.rb +59 -0
  196. data/lib/insika/safety/grounding_validator.rb +49 -0
  197. data/lib/insika/safety/input_guardrail.rb +1 -1
  198. data/lib/insika/safety/moderator.rb +1 -1
  199. data/lib/insika/safety/output_filter.rb +9 -5
  200. data/lib/insika/safety/output_validator.rb +11 -5
  201. data/lib/insika/schedule.rb +177 -0
  202. data/lib/insika/schedule_engine.rb +314 -0
  203. data/lib/insika/schedule_store.rb +208 -0
  204. data/lib/insika/schema_guard.rb +35 -0
  205. data/lib/insika/server/app.rb +247 -17
  206. data/lib/insika/server/rack_app.rb +21 -1
  207. data/lib/insika/server/responses.rb +40 -1
  208. data/lib/insika/session_actor.rb +8 -4
  209. data/lib/insika/session_store.rb +65 -2
  210. data/lib/insika/settings_store.rb +10 -0
  211. data/lib/insika/shadow_pair_store.rb +258 -0
  212. data/lib/insika/skill_catalog.rb +16 -0
  213. data/lib/insika/soak/envelope.rb +140 -0
  214. data/lib/insika/soak/report.rb +392 -0
  215. data/lib/insika/soak/runner.rb +554 -0
  216. data/lib/insika/steer_injector.rb +21 -10
  217. data/lib/insika/store.rb +10 -1
  218. data/lib/insika/stores/memory.rb +6 -0
  219. data/lib/insika/stores/sqlite.rb +8 -0
  220. data/lib/insika/studio/app.rb +1437 -54
  221. data/lib/insika/studio/assets/dist/application.css +1 -1
  222. data/lib/insika/studio/assets/dist/application.js +23 -23
  223. data/lib/insika/studio/assets/dist/favicon.svg +6 -0
  224. data/lib/insika/studio/forms.rb +308 -10
  225. data/lib/insika/studio/nav_icons.rb +19 -1
  226. data/lib/insika/studio/views/_agent_tab_cache.erb +25 -0
  227. data/lib/insika/studio/views/_agent_tab_config.erb +514 -0
  228. data/lib/insika/studio/views/_agent_tab_history.erb +24 -0
  229. data/lib/insika/studio/views/_agent_tab_loops.erb +54 -0
  230. data/lib/insika/studio/views/_agent_tab_memory.erb +51 -0
  231. data/lib/insika/studio/views/_agent_tab_outcomes.erb +31 -0
  232. data/lib/insika/studio/views/_agent_tab_prompts.erb +108 -0
  233. data/lib/insika/studio/views/_agent_tab_skills.erb +38 -0
  234. data/lib/insika/studio/views/_agents_master.erb +44 -0
  235. data/lib/insika/studio/views/_message.erb +49 -32
  236. data/lib/insika/studio/views/agent_detail.erb +62 -278
  237. data/lib/insika/studio/views/agents.erb +71 -54
  238. data/lib/insika/studio/views/approvals.erb +4 -1
  239. data/lib/insika/studio/views/artifact.erb +23 -0
  240. data/lib/insika/studio/views/artifacts.erb +59 -0
  241. data/lib/insika/studio/views/chats.erb +4 -1
  242. data/lib/insika/studio/views/customer.erb +94 -0
  243. data/lib/insika/studio/views/customers.erb +32 -0
  244. data/lib/insika/studio/views/evals.erb +6 -3
  245. data/lib/insika/studio/views/facts.erb +133 -0
  246. data/lib/insika/studio/views/followups.erb +125 -0
  247. data/lib/insika/studio/views/funnel.erb +106 -0
  248. data/lib/insika/studio/views/harvest.erb +234 -0
  249. data/lib/insika/studio/views/home.erb +106 -66
  250. data/lib/insika/studio/views/knowledge.erb +123 -0
  251. data/lib/insika/studio/views/layout.erb +15 -11
  252. data/lib/insika/studio/views/mcp.erb +174 -80
  253. data/lib/insika/studio/views/parity.erb +147 -0
  254. data/lib/insika/studio/views/playground.erb +7 -1
  255. data/lib/insika/studio/views/session.erb +233 -124
  256. data/lib/insika/studio/views/settings.erb +41 -1
  257. data/lib/insika/studio/views/skills.erb +1 -2
  258. data/lib/insika/studio/views/system_files.erb +1 -1
  259. data/lib/insika/studio/views/task.erb +13 -0
  260. data/lib/insika/studio/views/tasks.erb +4 -1
  261. data/lib/insika/studio/views/tools.erb +24 -10
  262. data/lib/insika/task_store.rb +21 -1
  263. data/lib/insika/templates/browser-agent/README.md +36 -0
  264. data/lib/insika/templates/browser-agent/agent.rb +49 -0
  265. data/lib/insika/templates/daily-digest/README.md +38 -0
  266. data/lib/insika/templates/daily-digest/agent.rb +77 -0
  267. data/lib/insika/templates/repo-explorer/README.md +36 -0
  268. data/lib/insika/templates/repo-explorer/agent.rb +45 -0
  269. data/lib/insika/templates/research-analyst/README.md +26 -0
  270. data/lib/insika/templates/research-analyst/agent.rb +58 -0
  271. data/lib/insika/templates/review-panel/README.md +20 -0
  272. data/lib/insika/templates/review-panel/agent.rb +50 -0
  273. data/lib/insika/templates/travel-planner/README.md +35 -0
  274. data/lib/insika/templates/travel-planner/agent.rb +87 -0
  275. data/lib/insika/templates.rb +112 -0
  276. data/lib/insika/testing/store_contract.rb +27 -6
  277. data/lib/insika/tick.rb +47 -11
  278. data/lib/insika/timezone.rb +45 -0
  279. data/lib/insika/tool_definition.rb +17 -7
  280. data/lib/insika/tool_envelope.rb +69 -0
  281. data/lib/insika/tool_manifest.rb +5 -1
  282. data/lib/insika/tools/data_defined_tool.rb +10 -0
  283. data/lib/insika/tools/generate_image.rb +89 -0
  284. data/lib/insika/tools/load_knowledge.rb +74 -0
  285. data/lib/insika/tools/run_persona_eval.rb +328 -0
  286. data/lib/insika/tools/save_artifact.rb +95 -0
  287. data/lib/insika/tools/schedule_followup.rb +164 -0
  288. data/lib/insika/tools/tts.rb +47 -0
  289. data/lib/insika/tools/update_briefing.rb +126 -0
  290. data/lib/insika/turn_output.rb +1 -1
  291. data/lib/insika/turn_state.rb +49 -1
  292. data/lib/insika/turn_timing.rb +22 -2
  293. data/lib/insika/version.rb +1 -1
  294. data/lib/insika/vitals.rb +84 -0
  295. data/lib/insika/wiring/graph.rb +472 -13
  296. data/lib/insika/wiring/graph_chat.rb +102 -0
  297. data/lib/insika.rb +149 -3
  298. metadata +181 -5
  299. data/docs/build.md +0 -14
  300. data/docs/understand.md +0 -10
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Insika
4
+ module Wiring
5
+ # A synchronous, in-process "chat" seam over an assembled `Graph::Result`:
6
+ # dispatch a Command, drain the event stream to its terminal event, hand
7
+ # back the outcome. Extracted from `DSL::Runtime#chat`/`#run_workflow`
8
+ # (C3.1) so a graph built OUTSIDE the DSL — `config/deployment.rb`, the
9
+ # actual production/round1 composition root `config.ru` boots — can hand a
10
+ # `#chat`-capable object to anything that needs one (today:
11
+ # `run_persona_eval`'s `Evals::GraphTransport` seam), without a second copy
12
+ # of this dispatch+drain plumbing. `DSL::Runtime` now delegates here too —
13
+ # one implementation, exercised by both roots.
14
+ class GraphChat
15
+ TERMINAL = %i[task_completed task_failed task_cancelled].freeze
16
+
17
+ def initialize(graph:)
18
+ @graph = graph
19
+ end
20
+
21
+ # One turn, in-process -> the assistant's text. `agent:` is REQUIRED —
22
+ # this seam has no notion of "the default agent" (that is a DSL::Runtime
23
+ # concept, filled in by its own caller before delegating here). Raises
24
+ # Insika::Error on a failed/cancelled turn, or the command's own
25
+ # rejection (unknown agent, bad schema) verbatim.
26
+ def chat(message, agent:, session_id: nil, timeout: nil)
27
+ command = Insika::Command.build(
28
+ :send_message, { agent: agent.to_s, message: message, session_id: session_id },
29
+ transport: :cli
30
+ )
31
+ run_command(command, session_id: session_id, timeout: timeout)[:text]
32
+ end
33
+
34
+ # Dispatch + drain, generic over any Command — the seam a workflow run
35
+ # also needs (a :trigger_workflow Command carries :output, not :text).
36
+ # Subscribes BEFORE dispatching (the fiber may emit eagerly) and binds to
37
+ # the dispatched task. A synchronous handler error (unknown agent/
38
+ # workflow, bad input against the schema) propagates untouched — the
39
+ # caller sees the real ValidationError/NotFoundError, not a turn failure.
40
+ def run_command(command, session_id:, timeout:)
41
+ require "async"
42
+ outcome = {}
43
+ rejected = nil
44
+ Async do |task|
45
+ serving = !session_id.nil?
46
+ @graph.executor.supervised = true if serving
47
+ ensure_session(session_id) if session_id
48
+ sub = @graph.event_stream.subscribe
49
+ res = begin
50
+ @graph.bus.dispatch(command)
51
+ rescue StandardError => e
52
+ # CAPTURED, not re-raised inside the reactor: letting it escape the
53
+ # Async block logs "Task may have ended with unhandled exception" —
54
+ # alarming noise for a DOCUMENTED rejection (a schema violation, an
55
+ # unknown agent). Re-raised verbatim below, outside the reactor.
56
+ sub.close
57
+ rejected = e
58
+ next
59
+ end
60
+ sub.bind(task_id: res[:task_id])
61
+ drain(sub, outcome, task, timeout)
62
+ teardown_serving if serving
63
+ end.wait
64
+ raise rejected if rejected
65
+ raise Insika::Error, "turn #{outcome[:error]}" if outcome[:error]
66
+
67
+ outcome
68
+ end
69
+
70
+ private
71
+
72
+ # Reads the stream until this turn reaches a terminal event, then stops.
73
+ # A workflow run also carries its typed OUTPUT, which is not the turn text.
74
+ def drain(sub, outcome, task, timeout)
75
+ reader = task.async do
76
+ sub.each do |ev|
77
+ case ev.type
78
+ when :task_completed then outcome[:text] = ev.data[:content].to_s
79
+ when :workflow_completed then outcome[:output] = ev.data[:output]
80
+ when :task_failed then outcome[:error] = "failed: #{ev.data[:message] || ev.data[:error]}"
81
+ when :task_cancelled then outcome[:error] = "cancelled"
82
+ end
83
+ sub.close if TERMINAL.include?(ev.type)
84
+ end
85
+ end
86
+ timeout ? task.with_timeout(timeout) { reader.wait } : reader.wait
87
+ rescue Async::TimeoutError
88
+ outcome[:error] = "timed out after #{timeout}s"
89
+ sub.close
90
+ end
91
+
92
+ def ensure_session(session_id)
93
+ @graph.session_store.find(session_id) || @graph.session_store.create(id: session_id, vars: {})
94
+ end
95
+
96
+ def teardown_serving
97
+ @graph.executor.stop_session_actors
98
+ @graph.executor.instance_variable_get(:@supervisor)&.stop
99
+ end
100
+ end
101
+ end
102
+ end
data/lib/insika.rb CHANGED
@@ -1,13 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Templates under lib/insika/templates/*/agent.rb open with a bare
4
+ # `require "insika"` (the line a standalone `ruby agent.rb` run needs) and
5
+ # Templates.evaluate instance_evals that same source in-process — so this
6
+ # file's own directory must be on $LOAD_PATH, or that require raises
7
+ # LoadError whenever nothing else already activated the "insika" gem
8
+ # (no Bundler.setup, no globally installed gem).
9
+ $LOAD_PATH.unshift(__dir__) unless $LOAD_PATH.include?(__dir__)
10
+
3
11
  require_relative "insika/version"
4
12
  require_relative "insika/errors"
13
+ # the payload selection + the domain-boundary audit yardstick.
14
+ # Pure module — loaded by the gemspec too, so it carries no app requires.
15
+ require_relative "insika/packaging"
5
16
  require_relative "insika/provider_error_classifier"
6
17
  require_relative "insika/token_store"
7
18
  require_relative "insika/budget_ledger"
8
19
  require_relative "insika/circuit_state"
9
20
  require_relative "insika/reliability"
21
+ require_relative "insika/routing"
22
+ require_relative "insika/media"
10
23
  require_relative "insika/alert_dispatcher"
24
+ require_relative "insika/outcome_store"
25
+ require_relative "insika/retention"
26
+ require_relative "insika/funnel_declaration"
27
+ require_relative "insika/funnel_store"
28
+ require_relative "insika/funnel_fold"
29
+ # the parsed follow-up policy of ONE agent — the ONLY shape the
30
+ # engine accepts (tool/engine/doctor/Studio share it). Pure value object.
31
+ require_relative "insika/followup_policy"
32
+ # the contact-state cells and the follow-up schedule records.
33
+ # Both are dumb domain stores over the injected backend.
34
+ require_relative "insika/contact_store"
35
+ require_relative "insika/followup_store"
36
+ # the tick-driven firer — rides the same tick as retention/funnel.
37
+ require_relative "insika/followup_engine"
38
+ # IANA zone resolution through the OS tz database — the stdlib-only route
39
+ # to a zone NAME (Follow-up quiet hours, the cron scheduler, the doctor).
40
+ require_relative "insika/timezone"
41
+ # the recurring schedule: the five-field cron subset + next-fire
42
+ # materialization, the declaration parse, the per-agent rows, and the
43
+ # tick-driven firer (the recurring half of the tick).
44
+ require_relative "insika/cron"
45
+ require_relative "insika/schedule"
46
+ require_relative "insika/schedule_store"
47
+ require_relative "insika/schedule_engine"
48
+ # the report destination — one record per run, no
49
+ # versioning; the signing half of the sharing link (HMAC, no secret stored).
50
+ require_relative "insika/artifact_store"
51
+ require_relative "insika/artifact_signing"
52
+ require_relative "insika/commands/freeze_funnel_baseline"
11
53
  require_relative "insika/channels/webhook"
12
54
  require_relative "insika/coercion"
13
55
  require_relative "insika/message_origin"
@@ -21,6 +63,9 @@ require_relative "insika/model_selection"
21
63
  require_relative "insika/model_resolver"
22
64
  require_relative "insika/tool_definition"
23
65
  require_relative "insika/tool_manifest"
66
+ # the pack's grounding policy (Insika::Grounding + the
67
+ # GroundingMatcher it wraps). Pure Ruby — profile data, parsed per turn.
68
+ require_relative "insika/grounding"
24
69
  require_relative "insika/frontmatter"
25
70
  require_relative "insika/token_estimator"
26
71
  require_relative "insika/checkpoint"
@@ -33,9 +78,12 @@ require_relative "insika/usage_ledger"
33
78
  require_relative "insika/budget_ledger"
34
79
  require_relative "insika/edge_limiter"
35
80
  require_relative "insika/tool_output_compressor"
36
- # Content safety / guardrails. detectors.rb is self-contained (the eval
37
- # requires it directly); the rest hang off Middleware/hooks seams. No ruby_llm
38
- # at load-time — Factory requires the gem lazily, like the Executor's create_chat.
81
+ # Content safety / guardrails. The pattern SOURCE is the
82
+ # language-tagged data in safety/corpus.rb; detectors.rb compiles it. Both are
83
+ # self-contained (the eval requires detectors.rb directly); the rest hang off
84
+ # Middleware/hooks seams. No ruby_llm at load-time — Factory requires the gem
85
+ # lazily, like the Executor's create_chat.
86
+ require_relative "insika/safety/corpus"
39
87
  require_relative "insika/safety/detectors"
40
88
  require_relative "insika/safety/safe_responses"
41
89
  require_relative "insika/safety/config"
@@ -55,7 +103,13 @@ require_relative "insika/context/providers/skill"
55
103
  require_relative "insika/context/providers/skill_trigger"
56
104
  require_relative "insika/context/providers/tool_search"
57
105
  require_relative "insika/context/providers/memory"
106
+ require_relative "insika/context/providers/knowledge"
58
107
  require_relative "insika/context/providers/session"
108
+ require_relative "insika/context/providers/briefing"
109
+ # the cache-prefix hash chain + the per-agent cache-hit series.
110
+ # Both are referenced by the Executor at runtime, so they load before it.
111
+ require_relative "insika/prefix_fingerprint"
112
+ require_relative "insika/cache_series_store"
59
113
  require_relative "insika/policy/policy"
60
114
  require_relative "insika/policy/engine"
61
115
  require_relative "insika/registry"
@@ -78,8 +132,13 @@ require_relative "insika/delegation_store"
78
132
  # Channels: the outbound record + the inbound retry window. Both are
79
133
  # plain stores; the channel objects themselves come after the HTTP client.
80
134
  require_relative "insika/outbox_store"
135
+ require_relative "insika/shadow_pair_store"
81
136
  require_relative "insika/inbound_log"
82
137
  require_relative "insika/memory_store"
138
+ require_relative "insika/knowledge_store"
139
+ # the operator-mutation audit trail. After memory_store (no
140
+ # mutual deps). Pure stdlib — `load_guard_spec` stays green.
141
+ require_relative "insika/memory_audit_store"
83
142
  require_relative "insika/config_store"
84
143
  require_relative "insika/profile_source"
85
144
  require_relative "insika/agent_file_store"
@@ -88,6 +147,10 @@ require_relative "insika/secret_masking"
88
147
  require_relative "insika/tool_store"
89
148
  require_relative "insika/tool_trace_store"
90
149
  require_relative "insika/context_trace_store"
150
+ # the model-visible payload of one ask + its durable trace —
151
+ # "model-visible means logged" (the conformance suite's reconstruction half).
152
+ require_relative "insika/model_visible"
153
+ require_relative "insika/model_visible_trace_store"
91
154
  # Refinement: the run record + the evidence half of the loop.
92
155
  # Reads sessions/tasks/traces above; requires Safety::Detectors (loaded earlier) for
93
156
  # the PII redaction of the snippets it puts in a report.
@@ -101,6 +164,9 @@ require_relative "insika/refinement/candidate"
101
164
  require_relative "insika/refinement/proposer"
102
165
  require_relative "insika/egress_guard"
103
166
  require_relative "insika/schema_guard"
167
+ # the evidence contract (Spec + Processor + EvidenceLedger). Pure Ruby.
168
+ # Required BEFORE tool_envelope.rb — the envelope references it at runtime.
169
+ require_relative "insika/evidence"
104
170
  require_relative "insika/sandbox"
105
171
  require_relative "insika/http_client"
106
172
  # Channels: the registry, the bundled relay adapter and the
@@ -130,6 +196,14 @@ require_relative "insika/evals/runner"
130
196
  require_relative "insika/evals/report"
131
197
  require_relative "insika/evals/baseline"
132
198
  require_relative "insika/evals/transport"
199
+ # simulated users: the persona data + the conversation driver.
200
+ # Pure — the persona model is an injected ask, the target rides the Transport.
201
+ require_relative "insika/evals/persona"
202
+ require_relative "insika/evals/simulator"
203
+ # shadow parity: the frozen criterion and the mechanical
204
+ # fold over the pair store (C6). Pure — no store, no provider gem.
205
+ require_relative "insika/parity/criterion"
206
+ require_relative "insika/parity/verdict"
133
207
  # Authored eval cases: the corpus becomes editable without a
134
208
  # checkout. Requires the loader above (it is the one validator).
135
209
  require_relative "insika/golden_store"
@@ -143,6 +217,14 @@ require_relative "insika/refinement/panel"
143
217
  require_relative "insika/mcp_store"
144
218
  require_relative "insika/mcp_http_client"
145
219
  require_relative "insika/mcp_tool_ingestor"
220
+ # require "ruby_llm/mcp" itself is LAZY, inside .for — this require_relative only
221
+ # loads the thin factory (see spec/insika/load_guard_spec.rb).
222
+ require_relative "insika/mcp_client"
223
+ # insika/mcp_live_tool (< RubyLLM::Tool) is NOT required here — McpToolRegistry
224
+ # require_relative's it lazily on the 1st instance (turn time), same as
225
+ # OverlayToolRegistry does for tools/data_defined_tool.
226
+ require_relative "insika/mcp_tool_registry"
227
+ require_relative "insika/mcp_json"
146
228
  require_relative "insika/system_file_store"
147
229
  require_relative "insika/recovery"
148
230
  require_relative "insika/command_bus"
@@ -177,6 +259,54 @@ require_relative "insika/commands/delete_llm_provider"
177
259
  require_relative "insika/commands/issue_tenant_token"
178
260
  require_relative "insika/commands/revoke_token"
179
261
  require_relative "insika/commands/rotate_tenant_token"
262
+ require_relative "insika/commands/record_outcome"
263
+ require_relative "insika/commands/record_shadow_reply"
264
+ require_relative "insika/commands/judge_shadow_pairs"
265
+ require_relative "insika/commands/session_purge"
266
+ require_relative "insika/commands/forget_customer"
267
+ require_relative "insika/commands/delete_tenant_data"
268
+ # the LGPD access right — export one customer's memory cell as
269
+ # content (the Studio download); the event stays counts-only.
270
+ require_relative "insika/commands/export_customer_memory"
271
+ # the operator/integration follow-up mutations (cancel one
272
+ # record; revoke a contact + fall its pending records atomically).
273
+ require_relative "insika/commands/cancel_followup"
274
+ require_relative "insika/commands/revoke_contact"
275
+ # the report destination's Studio mutation — delete one artifact
276
+ # (a bus command, like every Studio mutation).
277
+ require_relative "insika/commands/delete_artifact"
278
+ # session distillation — the distiller (pure, injected ask)
279
+ # and the proposal store (proposals + the latched dedup ledger + the
280
+ # per-session distilled marker).
281
+ require_relative "insika/distill"
282
+ require_relative "insika/proposal_store"
283
+ require_relative "insika/commands/run_distillation"
284
+ require_relative "insika/distill_engine"
285
+ require_relative "insika/commands/resolve_proposal"
286
+ # the gated harvest — the miner (pure, injected ask), the
287
+ # frozen conversion criterion and the versioned negative list. The provider
288
+ # touch stays inside MinerFactory's lazy ask (load_guard stays green).
289
+ require_relative "insika/harvest"
290
+ require_relative "insika/harvest/criterion"
291
+ require_relative "insika/harvest/negative_list"
292
+ require_relative "insika/harvest/conversion_gate"
293
+ require_relative "insika/harvest/gate"
294
+ require_relative "insika/harvest_store"
295
+ require_relative "insika/commands/run_harvest"
296
+ require_relative "insika/commands/gate_harvest"
297
+ require_relative "insika/commands/promote_harvest"
298
+ require_relative "insika/commands/rollback_harvest"
299
+ require_relative "insika/commands/reject_harvest"
300
+ require_relative "insika/harvest_engine"
301
+ # post-turn learning — the extractor (pure, injected ask) and the
302
+ # concept format itself (markdown + YAML frontmatter, the SkillCatalog
303
+ # split). The provider touch stays inside ExtractorFactory's lazy ask
304
+ # (load_guard stays green).
305
+ require_relative "insika/knowledge"
306
+ require_relative "insika/commands/backfill_knowledge"
307
+ require_relative "insika/commands/write_concept"
308
+ require_relative "insika/commands/delete_concept"
309
+ require_relative "insika/commands/restore_concept"
180
310
  require_relative "insika/commands/upsert_mcp"
181
311
  require_relative "insika/commands/delete_mcp"
182
312
  require_relative "insika/commands/write_system_file"
@@ -187,6 +317,14 @@ require_relative "insika/commands/delete_data_tool"
187
317
  require_relative "insika/commands/restore_data_tool"
188
318
  require_relative "insika/commands/import_tools"
189
319
  require_relative "insika/commands/import_mcp_tools"
320
+ require_relative "insika/commands/refresh_mcp_tools"
321
+ # the demo seed (OSS onboarding): one bundled agent + golden
322
+ # set + the Seeder that populates every loop's stores at once, and its bus
323
+ # adapter for `insika demo:seed` and the Studio's "Seed demo data" button.
324
+ require_relative "insika/demo/agent_attrs"
325
+ require_relative "insika/demo/golden_cases"
326
+ require_relative "insika/demo/seeder"
327
+ require_relative "insika/commands/seed_demo_data"
190
328
  require_relative "insika/event_stream"
191
329
  require_relative "insika/task_actor"
192
330
  require_relative "insika/queue_policy"
@@ -195,6 +333,7 @@ require_relative "insika/skill_catalog"
195
333
  require_relative "insika/tool_catalog"
196
334
  require_relative "insika/steer_injector"
197
335
  require_relative "insika/loop_detector"
336
+ require_relative "insika/balloon_splitter"
198
337
  require_relative "insika/turn_output"
199
338
  require_relative "insika/turn_state"
200
339
  require_relative "insika/turn_timing"
@@ -207,10 +346,17 @@ require_relative "insika/shutdown"
207
346
  require_relative "insika/tick"
208
347
  require_relative "insika/pack"
209
348
  require_relative "insika/pack_importer"
349
+ require_relative "insika/templates"
210
350
  require_relative "insika/telemetry"
211
351
  # Strict config + diagnosis. Doctor reads the config stores above;
212
352
  # EnvSchema (required at the top) is its env layer.
213
353
  require_relative "insika/doctor"
354
+ # Soak: the 72h uptime-degradation harness. Pure stdlib — the
355
+ # envelope and the report fold are deterministic, the runner only talks Net::HTTP.
356
+ require_relative "insika/soak/envelope"
357
+ require_relative "insika/soak/report"
358
+ require_relative "insika/soak/runner"
359
+ require_relative "insika/vitals"
214
360
  # Shared composition core for both roots (config/wiring.rb + config/deployment.rb).
215
361
  # Only references the classes above at call-time, so require order is unconstrained.
216
362
  require_relative "insika/wiring/graph"