turnkit 0.4.1 → 0.4.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +111 -50
  4. data/UPGRADE.md +29 -0
  5. data/UPGRADE_TO_0_4_2.md +425 -0
  6. data/lib/{turnkit/generators → generators}/turnkit/install/templates/initializer.rb +7 -6
  7. data/lib/turnkit/{stores/active_record_store.rb → active_record_store.rb} +18 -4
  8. data/lib/turnkit/adapters/codex.rb +8 -11
  9. data/lib/turnkit/adapters/ruby_llm.rb +30 -46
  10. data/lib/turnkit/agent.rb +43 -10
  11. data/lib/turnkit/budget.rb +1 -1
  12. data/lib/turnkit/client.rb +5 -1
  13. data/lib/turnkit/compaction.rb +46 -46
  14. data/lib/turnkit/cost.rb +29 -31
  15. data/lib/turnkit/image_result.rb +1 -0
  16. data/lib/turnkit/image_tool.rb +2 -2
  17. data/lib/turnkit/media_analysis_result.rb +0 -2
  18. data/lib/turnkit/model_request.rb +4 -2
  19. data/lib/turnkit/output_policy.rb +1 -15
  20. data/lib/turnkit/run.rb +0 -4
  21. data/lib/turnkit/store.rb +4 -6
  22. data/lib/turnkit/sub_agent_tool.rb +9 -14
  23. data/lib/turnkit/system_prompt.rb +32 -96
  24. data/lib/turnkit/tool.rb +5 -16
  25. data/lib/turnkit/turn.rb +73 -89
  26. data/lib/turnkit/version.rb +1 -1
  27. data/lib/turnkit/view_media_tool.rb +2 -2
  28. data/lib/turnkit.rb +1 -18
  29. metadata +15 -30
  30. data/lib/turnkit/prompt_contribution.rb +0 -13
  31. data/lib/turnkit/rails/railtie.rb +0 -9
  32. data/lib/turnkit/workflow.rb +0 -58
  33. /data/lib/{turnkit/generators → generators}/turnkit/install/templates/conversation.rb +0 -0
  34. /data/lib/{turnkit/generators → generators}/turnkit/install/templates/create_turnkit_tables.rb +0 -0
  35. /data/lib/{turnkit/generators → generators}/turnkit/install/templates/message.rb +0 -0
  36. /data/lib/{turnkit/generators → generators}/turnkit/install/templates/tool_execution.rb +0 -0
  37. /data/lib/{turnkit/generators → generators}/turnkit/install/templates/turn.rb +0 -0
  38. /data/lib/{turnkit/generators → generators}/turnkit/install_generator.rb +0 -0
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turnkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Couch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-19 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: ruby_llm
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.14'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.14'
11
+ date: 2026-07-02 00:00:00.000000000 Z
12
+ dependencies: []
27
13
  description: TurnKit is a Ruby/Rails agent runtime for durable AI conversations, application
28
- runs, reusable workflows, tool calling, skills, sub-agents, context compaction,
14
+ runs, orchestrator agents, tool calling, skills, sub-agents, context compaction,
29
15
  and persistence.
30
16
  email:
31
17
  - sam@samcouch.com
@@ -37,7 +23,16 @@ files:
37
23
  - LICENSE.md
38
24
  - README.md
39
25
  - UPGRADE.md
26
+ - UPGRADE_TO_0_4_2.md
27
+ - lib/generators/turnkit/install/templates/conversation.rb
28
+ - lib/generators/turnkit/install/templates/create_turnkit_tables.rb
29
+ - lib/generators/turnkit/install/templates/initializer.rb
30
+ - lib/generators/turnkit/install/templates/message.rb
31
+ - lib/generators/turnkit/install/templates/tool_execution.rb
32
+ - lib/generators/turnkit/install/templates/turn.rb
33
+ - lib/generators/turnkit/install_generator.rb
40
34
  - lib/turnkit.rb
35
+ - lib/turnkit/active_record_store.rb
41
36
  - lib/turnkit/adapters/codex.rb
42
37
  - lib/turnkit/adapters/ruby_llm.rb
43
38
  - lib/turnkit/agent.rb
@@ -49,13 +44,6 @@ files:
49
44
  - lib/turnkit/cost.rb
50
45
  - lib/turnkit/error.rb
51
46
  - lib/turnkit/event.rb
52
- - lib/turnkit/generators/turnkit/install/templates/conversation.rb
53
- - lib/turnkit/generators/turnkit/install/templates/create_turnkit_tables.rb
54
- - lib/turnkit/generators/turnkit/install/templates/initializer.rb
55
- - lib/turnkit/generators/turnkit/install/templates/message.rb
56
- - lib/turnkit/generators/turnkit/install/templates/tool_execution.rb
57
- - lib/turnkit/generators/turnkit/install/templates/turn.rb
58
- - lib/turnkit/generators/turnkit/install_generator.rb
59
47
  - lib/turnkit/id.rb
60
48
  - lib/turnkit/image_result.rb
61
49
  - lib/turnkit/image_tool.rb
@@ -69,16 +57,13 @@ files:
69
57
  - lib/turnkit/output_audit.rb
70
58
  - lib/turnkit/output_policy.rb
71
59
  - lib/turnkit/prompt_context.rb
72
- - lib/turnkit/prompt_contribution.rb
73
60
  - lib/turnkit/prompt_data.rb
74
- - lib/turnkit/rails/railtie.rb
75
61
  - lib/turnkit/record.rb
76
62
  - lib/turnkit/result.rb
77
63
  - lib/turnkit/run.rb
78
64
  - lib/turnkit/schema_check.rb
79
65
  - lib/turnkit/skill.rb
80
66
  - lib/turnkit/store.rb
81
- - lib/turnkit/stores/active_record_store.rb
82
67
  - lib/turnkit/sub_agent_tool.rb
83
68
  - lib/turnkit/system_prompt.rb
84
69
  - lib/turnkit/tool.rb
@@ -89,7 +74,6 @@ files:
89
74
  - lib/turnkit/usage.rb
90
75
  - lib/turnkit/version.rb
91
76
  - lib/turnkit/view_media_tool.rb
92
- - lib/turnkit/workflow.rb
93
77
  homepage: https://github.com/samuelcouch/turnkit
94
78
  licenses:
95
79
  - MIT
@@ -117,5 +101,6 @@ requirements: []
117
101
  rubygems_version: 3.5.22
118
102
  signing_key:
119
103
  specification_version: 4
120
- summary: Ruby/Rails agent runtime for durable AI conversations, runs, and workflows.
104
+ summary: Ruby/Rails agent runtime for durable AI conversations, runs, and orchestrator
105
+ agents.
121
106
  test_files: []
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TurnKit
4
- class PromptContribution
5
- attr_accessor :stable_prefix, :dynamic_suffix, :section_overrides
6
-
7
- def initialize(stable_prefix: nil, dynamic_suffix: nil, section_overrides: nil)
8
- @stable_prefix = stable_prefix.to_s
9
- @dynamic_suffix = dynamic_suffix.to_s
10
- @section_overrides = (section_overrides || {}).transform_keys(&:to_sym)
11
- end
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TurnKit
4
- class Railtie < Rails::Railtie
5
- generators do
6
- require_relative "../generators/turnkit/install_generator"
7
- end
8
- end
9
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "agent"
4
-
5
- module TurnKit
6
- class Workflow
7
- ORCHESTRATOR_PREAMBLE = <<~TEXT.strip
8
- You are an autonomous task orchestrator. Navigate from the application
9
- request to a final output without asking the user follow-up questions.
10
-
11
- Use the available tools to gather context, inspect sources, take actions,
12
- persist outputs, and verify work. Use loaded skills as reusable workflow
13
- patterns. Iterate when work needs missing context, critique, revision, or
14
- verification.
15
-
16
- When multiple independent items need the same kind of fetch or read, and
17
- an available batch tool can handle them in one call, prefer the batch tool
18
- over repeated one-item tool calls.
19
-
20
- Stop when the task is complete, when the available context and tools are
21
- sufficient for the best possible answer, or when further iteration would
22
- not materially improve the result. Respect runtime, cost, and iteration
23
- limits.
24
- TEXT
25
-
26
- DEFAULT_INSTRUCTIONS = ORCHESTRATOR_PREAMBLE
27
-
28
- attr_reader :name, :options
29
-
30
- def initialize(name: "workflow", instructions: nil, preamble: true, **options)
31
- @name = name.to_s
32
- raise ArgumentError, "name is required" if @name.empty?
33
-
34
- @options = options.merge(
35
- name: @name,
36
- prompt_mode: options.fetch(:prompt_mode, :task),
37
- instructions: compose_instructions(instructions, preamble: preamble)
38
- ).freeze
39
- @agent = Agent.new(**@options)
40
- end
41
-
42
- def run(prompt = nil, task: nil, input: nil, async: false, subject: nil, metadata: {}, **overrides)
43
- agent(**overrides).run(task || prompt, input: input, async: async, subject: subject, metadata: metadata)
44
- end
45
-
46
- def agent(**overrides)
47
- overrides.empty? ? @agent : Agent.new(**@options.merge(overrides.compact))
48
- end
49
-
50
- private
51
- def compose_instructions(instructions, preamble:)
52
- parts = []
53
- parts << ORCHESTRATOR_PREAMBLE if preamble
54
- parts << instructions.to_s.strip unless instructions.to_s.strip.empty?
55
- parts.join("\n\n")
56
- end
57
- end
58
- end