summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-08-20 15:30:59 -0600
committert <t@tjp.lol>2026-08-20 15:32:46 -0600
commit4183fdc7d3667fb4c2af72ff0098c15168c9e950 (patch)
tree8bf9aecc4e21966ae6854ce8aeeed92078363724 /spec
parentb7a1f0d934cab519613e8ee2a08f052e0d56687e (diff)
Expose a json codec to the subagents.lua sandbox
Model-authored workflow Lua could reach string, table, math, and utf8 but had no way to parse an agent's report, so any fan-out over discovered work had to invent an ad-hoc line format and hand-roll string.gmatch. Hand the guest panto.ext.json instead. decode returns nil plus a message rather than raising: the sandbox deliberately has no pcall, so a raising decoder would let one malformed agent line kill an entire workflow. Teach the pattern in the injected guidance too: deterministic Lua owns the loops, counts, ordering, and gates, agents supply discovery and judgment, and a worker that feeds Lua ends its report with one parseable line. The existing static-graph example stays; a discover-then-fan-out example joins it.
Diffstat (limited to 'spec')
-rw-r--r--spec/test_luatool.lua13
1 files changed, 13 insertions, 0 deletions
diff --git a/spec/test_luatool.lua b/spec/test_luatool.lua
index d002bca..62f9283 100644
--- a/spec/test_luatool.lua
+++ b/spec/test_luatool.lua
@@ -57,6 +57,19 @@ return {
assert(env.print() == nil)
end },
+ { "the guest json codec round-trips and reports bad input instead of raising", function()
+ local env = luatool.build_env()
+ local encoded = env.json.encode({ prs = { 124, 125 } })
+ has(encoded, "124")
+ local decoded = env.json.decode(encoded)
+ assert(type(decoded) == "table" and decoded.prs[2] == 125)
+ -- The sandbox has no pcall, so a raising decoder would kill a workflow
+ -- over one malformed agent line.
+ local value, message = env.json.decode("RESULT=not json")
+ assert(value == nil and type(message) == "string")
+ assert(env.json.decode(nil) == nil)
+ end },
+
{ "the string metatable stays reachable and harmless", function()
local env = luatool.build_env()
assert(type(("").dump) == "function")