summaryrefslogtreecommitdiff
path: root/subagents
diff options
context:
space:
mode:
Diffstat (limited to 'subagents')
-rw-r--r--subagents/luatool.lua26
-rw-r--r--subagents/workflow.lua1
2 files changed, 26 insertions, 1 deletions
diff --git a/subagents/luatool.lua b/subagents/luatool.lua
index dee7398..fced6b1 100644
--- a/subagents/luatool.lua
+++ b/subagents/luatool.lua
@@ -10,7 +10,8 @@
--
-- The source is loaded in text mode only (`load(source, chunkname, "t", env)`)
-- against a restricted `_ENV`. That environment holds a safe slice of the
--- standard library plus `subagents.workflow`; it has no `os`, `io`, `debug`,
+-- standard library, a `json` codec, and `subagents.workflow`; it has no `os`,
+-- `io`, `debug`,
-- `package`, `require`, `load`, `dofile`, `coroutine`, `setmetatable`, or
-- `getmetatable`, and `print` is a no-op so generated code cannot scribble on
-- the TUI. `string`, `table`, `math`, and `utf8` are shallow copies, so a guest
@@ -63,6 +64,27 @@ local function shallow_copy(source, skip)
return copy
end
+-- JSON for the guest. `decode` returns `nil, message` instead of raising:
+-- the sandbox has no `pcall`, so a raising decoder would make one malformed
+-- agent line kill the whole workflow.
+local function guest_json()
+ return {
+ decode = function(text)
+ if type(text) ~= "string" then
+ return nil, "expected a string"
+ end
+ local ok, value = pcall(workflow.json_decode, text)
+ if not ok then
+ return nil, tostring(value)
+ end
+ return value
+ end,
+ encode = function(value)
+ return workflow.json_encode(value)
+ end,
+ }
+end
+
-- Build a fresh restricted environment per call: the guest may mutate anything
-- it can reach, so nothing here is shared between invocations.
local function build_env(schedule)
@@ -82,6 +104,7 @@ local function build_env(schedule)
math = shallow_copy(math),
utf8 = shallow_copy(utf8),
print = function() end,
+ json = guest_json(),
subagents = {
workflow = schedule,
workflows = workflow.workflows,
@@ -92,6 +115,7 @@ local function build_env(schedule)
end
M.build_env = build_env
+M.guest_json = guest_json
-- Overlay workflow-local profiles without mutating the activation-time set.
-- Inline names intentionally win, matching normal layered profile precedence
diff --git a/subagents/workflow.lua b/subagents/workflow.lua
index 3a59a8b..375285f 100644
--- a/subagents/workflow.lua
+++ b/subagents/workflow.lua
@@ -155,6 +155,7 @@ local function json_encode(value)
end
M.json_encode = json_encode
+M.json_decode = json_decode
-- ---------------------------------------------------------------------------
-- Schema validation