ask-app-server 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b79c759ac798814a57a93e043992b9c619675cfddccb90eee218885e155099e7
4
- data.tar.gz: 6166e778d393be9ddcb2c14b979dbce511a29ac94db2dffadbf9fe3870afbeaa
3
+ metadata.gz: 72683929fd8e34512612ab2b8695d3016e3dd1d4382eec1e2107f4ec59ba99ff
4
+ data.tar.gz: 4527f49da84ded81cbf1caa7b09ccf469c79047be15df463b43afdf8c73e90c0
5
5
  SHA512:
6
- metadata.gz: 5ee5c8daac3b4dbe098a2f625f4a35561ae805d12cd419fd863ca7e27a9c33cd2e02ca075bc7f62ec867ff7e4441797b9f237d6081328a99f4f041ee180a80d0
7
- data.tar.gz: 41fdf574b1205efc0693916951f6a838e76cf9c6e3ea04ad8cf96ef94b07da7acfe08ac45be897e1c28b5c4dbbc1cbd7bf2bcf0c736011020b4804c2e9c18af2
6
+ metadata.gz: 9e7a8a5697ee9445f72c3ad0c0904256c7b61a7c25d86e7250a1345e84a0aed05972529f5fe30f7beb8fad8e540571df75927b607fd13dfbdedec1fbedf052ac
7
+ data.tar.gz: 06abc620c5c2b0f28a42ca9cdf16f3a9f60321828d937d10033a5594f69ad09fb3f3d8f01e7ee59754c9399f144edbd282be54fd03c177e26beb3028f47453d8
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.7.0] - 2026-09-23
6
+
7
+ ### Added
8
+
9
+ - Accept a host-owned project-rules object or workspace-aware provider in
10
+ `SessionManager`; selected rules are passed to Ask Agent only for the
11
+ matching verified workspace context. Rule persistence remains host-owned.
5
12
  ## [0.6.0] - 2026-09-23
6
13
  ## [0.5.0] - 2026-09-23
7
14
 
@@ -68,7 +68,7 @@ module Ask
68
68
  # Ask::Agent::Session.new (hooks, plan_mode, todos, ...)
69
69
  def initialize(model:, tools: nil, system_prompt: nil, agent_dir: nil,
70
70
  approval: :off, require_approval: nil, host: nil,
71
- state_adapter: nil, created_at: nil, project_grants: nil, **session_opts)
71
+ state_adapter: nil, created_at: nil, project_grants: nil, project_rules: nil, **session_opts)
72
72
  @model = model
73
73
  @system_prompt = system_prompt
74
74
  @tools = resolve_tools(tools)
@@ -77,6 +77,7 @@ module Ask
77
77
  @require_approval = require_approval
78
78
  @agent_dir = agent_dir
79
79
  @project_grants = project_grants
80
+ @project_rules = project_rules
80
81
  @host = host || build_durable_host(state_adapter)
81
82
  @durable_record = false
82
83
  # The session's workspace is the tools' home: bash commands
@@ -488,6 +489,7 @@ module Ask
488
489
  )
489
490
  opts = { queue: queue }
490
491
  opts[:project_grants] = @project_grants if @project_grants
492
+ opts[:project_rules] = @project_rules if @project_rules
491
493
  return opts if @approval == :auto
492
494
 
493
495
  opts.merge(require_approval: @require_approval)
@@ -32,7 +32,7 @@ module Ask
32
32
  attr_reader :blocked_tools
33
33
  attr_reader :permission_timeout
34
34
 
35
- def initialize(store: nil, host: nil, state_adapter: nil, permission_mode: :on_request, blocked_tools: nil, permission_timeout: 300)
35
+ def initialize(store: nil, host: nil, state_adapter: nil, permission_mode: :on_request, blocked_tools: nil, permission_timeout: 300, project_rules: nil)
36
36
  @state_adapter = state_adapter
37
37
  @project_grant_state = state_adapter || Ask::State::Memory.new
38
38
  @store = store || SessionStore.new(state: state_adapter)
@@ -42,6 +42,7 @@ module Ask
42
42
  @permission_mode = permission_mode
43
43
  @blocked_tools = (blocked_tools || DEFAULT_REQUIRE_APPROVAL).map(&:to_s)
44
44
  @permission_timeout = permission_timeout
45
+ @project_rules_provider = project_rules
45
46
  @session_event_observers = []
46
47
  @logger = Logger.new($stdout, level: ENV["DEBUG"] ? Logger::DEBUG || Logger::DEBUG : Logger::WARN)
47
48
  end
@@ -92,6 +93,7 @@ module Ask
92
93
  approval: approval_opts[:mode],
93
94
  require_approval: approval_opts[:require_approval],
94
95
  project_grants: project_grants_for(workspace_id),
96
+ project_rules: project_rules_for(canonical_workspace_path(workspace_path), workspace_id),
95
97
  plan_mode: plan_mode,
96
98
  host: @host
97
99
  )
@@ -162,6 +164,7 @@ module Ask
162
164
  approval: approval_opts[:mode],
163
165
  require_approval: approval_opts[:require_approval],
164
166
  project_grants: project_grants,
167
+ project_rules: project_rules_for(workspace_path, workspace_id),
165
168
  plan_mode: plan_mode,
166
169
  host: @host,
167
170
  created_at: record.created_at
@@ -185,6 +188,24 @@ module Ask
185
188
  end
186
189
  end
187
190
 
191
+ # Project rule storage and policy selection belong to the host. Supply
192
+ # either a PermissionRules instance or a callable receiving the
193
+ # verified workspace path and opaque workspace identity.
194
+ def project_rules_for(workspace_path, workspace_id)
195
+ provider = @project_rules_provider
196
+ return nil unless provider
197
+
198
+ rules = if provider.respond_to?(:call)
199
+ provider.call(workspace_path: workspace_path, workspace_id: workspace_id)
200
+ else
201
+ provider
202
+ end
203
+ return nil if rules.nil?
204
+ return rules if rules.respond_to?(:classify)
205
+
206
+ raise ArgumentError, 'project_rules provider must return an object responding to :classify'
207
+ end
208
+
188
209
  def workspace_identity(path)
189
210
  canonical = canonical_workspace_path(path)
190
211
  canonical && "workspace:#{Digest::SHA256.hexdigest(canonical)}"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ask
4
4
  module AppServer
5
- VERSION = "0.6.0"
5
+ VERSION = "0.7.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ask-app-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaka Ruto
@@ -113,14 +113,14 @@ dependencies:
113
113
  requirements:
114
114
  - - ">="
115
115
  - !ruby/object:Gem::Version
116
- version: 0.2.0
116
+ version: 0.3.0
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
- version: 0.2.0
123
+ version: 0.3.0
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: minitest
126
126
  requirement: !ruby/object:Gem::Requirement