summaryrefslogtreecommitdiff
path: root/lua/clever_f/acquisition_service.lua
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:09:07 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:09:07 +0200
commitb47d670d7613800633c91f9b22615fbd9f65c0de (patch)
tree0aa656351c980e97cdf84f4bbccb33a9e7770ae7 /lua/clever_f/acquisition_service.lua
parent5dbdb4010f2703d69fcd25a7045018aa3748c36b (diff)
Build fresh acquisition motion plan
Diffstat (limited to 'lua/clever_f/acquisition_service.lua')
-rw-r--r--lua/clever_f/acquisition_service.lua43
1 files changed, 40 insertions, 3 deletions
diff --git a/lua/clever_f/acquisition_service.lua b/lua/clever_f/acquisition_service.lua
index d632748..77d08ec 100644
--- a/lua/clever_f/acquisition_service.lua
+++ b/lua/clever_f/acquisition_service.lua
@@ -1,6 +1,7 @@
local domain = require("clever_f.domain")
local direct_preview_planner = require("clever_f.direct_preview_planner")
local feedback_service = require("clever_f.feedback_service")
+local motion_plan_factory = require("clever_f.motion_plan")
local policy = require("clever_f.policy")
local sequence_state = require("clever_f.sequence_state")
local state_transitions = require("clever_f.state_transitions")
@@ -137,14 +138,18 @@ function AcquisitionResult.new(request, options)
if target_plan ~= nil and not domain.TargetPlan.is(target_plan) then
fail("acquisition result target_plan must be a TargetPlan", 2)
end
+ local motion_plan = options.motion_plan
+ if motion_plan ~= nil and not domain.ResolvedMotionPlan.is(motion_plan) then
+ fail("acquisition result motion_plan must be a ResolvedMotionPlan", 2)
+ end
local result = setmetatable({}, result_metatable)
result_records[result] = {
request = request,
outcome = outcome,
target = target,
target_plan = target_plan,
- motion_plan = options.motion_plan,
- resolved_motion_plan = options.motion_plan,
+ motion_plan = motion_plan,
+ resolved_motion_plan = motion_plan,
previous_input_trigger = options.previous_input_trigger,
previous_target_source = options.previous_target_source,
cached_target = options.cached_target,
@@ -198,6 +203,7 @@ function TemporaryResourceScope.new(request, feedback)
missing_previous_input = false,
text_view = nil,
target_plan = nil,
+ motion_plan = nil,
outcome = nil,
}
return scope
@@ -270,6 +276,13 @@ function TemporaryResourceScope:set_target_plan(target_plan)
return set_scope_resource(self, "target_plan", target_plan)
end
+function TemporaryResourceScope:set_motion_plan(motion_plan)
+ if not domain.ResolvedMotionPlan.is(motion_plan) then
+ fail("temporary resource scope motion plan must be a ResolvedMotionPlan", 2)
+ end
+ return set_scope_resource(self, "motion_plan", motion_plan)
+end
+
function TemporaryResourceScope:set_outcome(outcome)
if not domain.ActionOutcome.is(outcome) then
fail("temporary resource scope outcome must be an ActionOutcome", 2)
@@ -328,6 +341,14 @@ local function require_target_factory(factory, policy_service)
return factory
end
+local function require_motion_factory(factory, policy_service)
+ factory = factory or motion_plan_factory.new({ policy = policy_service })
+ if type(factory) ~= "table" or type(factory.build_for_context) ~= "function" then
+ fail("AcquisitionService motion factory must build contextual plans", 3)
+ end
+ return factory
+end
+
local function require_feedback(feedback, host, policy_service, transitions)
feedback = feedback or feedback_service.new({
host = host,
@@ -397,6 +418,10 @@ function AcquisitionService.new(options, dependencies)
options.target_factory or options.target_plan_factory,
policy_service
),
+ motion_factory = require_motion_factory(
+ options.motion_factory or options.motion_plan_factory,
+ policy_service
+ ),
window = options.window or options.current_window,
last_scope = nil,
started_scope_count = 0,
@@ -714,19 +739,31 @@ function AcquisitionService:acquire(descriptor, context, position, count, macro_
)
local view = scope.text_view
or scope:set_text_view(text_topology.from_host(record.host))
+ local search_scope = record.policy:sample_search().search_scope
local target_plan = scope:set_target_plan(record.target_factory:build(
target,
nil,
{
text_view = view,
origin = request.position,
- search_scope = record.policy:sample_search().search_scope,
+ search_scope = search_scope,
effective_encoding = view.effective_encoding,
}
))
+ local selection = request.context.visual and record.host:read_selection() or nil
+ local motion_plan = scope:set_motion_plan(
+ record.motion_factory:build_for_context(
+ target_plan,
+ request.descriptor,
+ request.context,
+ selection,
+ search_scope
+ )
+ )
return AcquisitionResult.new(request, {
target = target,
target_plan = target_plan,
+ motion_plan = motion_plan,
acquisition_time_ms = acquisition_time_ms,
previous_input_trigger = trigger,
previous_target_source = scope.previous_target_source,