@lazyingart/agintiflow 0.20.214 → 0.20.215

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.
@@ -158,3 +158,31 @@ Independent verification passed the checked-in Java test script, the hidden
158
158
  event-window contract, generated-output tracking checks, clean-worktree checks,
159
159
  the focused permission/evidence regressions, and the complete AgInTiFlow npm
160
160
  suite.
161
+
162
+ ### Long-context memo synthesis and local visual verification
163
+
164
+ `memo-full-context-pdf-014` used a normal, short writing prompt against a
165
+ realistic interrupted chat export containing corrections, cancellations,
166
+ deadlines, dependencies, completed work, publication boundaries, research
167
+ ideas, and personal errands. The DeepSeek-backed writing agent read the full
168
+ history and produced an editable two-page XeLaTeX/PDF memo instead of copying
169
+ transport rows. Independent acceptance checked every critical commitment,
170
+ rejected raw timestamps and internal identifiers, verified the PDF structure,
171
+ and required a clean intentional commit.
172
+
173
+ The first draft generalized a concrete Nutstore private-backup destination and
174
+ left generated agent/perception directories unignored. The same durable session
175
+ accepted those exact external findings, restored the actionable destination,
176
+ added narrow generated-state ignores, rebuilt the PDF, inspected both rendered
177
+ pages, and committed the correction as `a275878`. The hidden full-context
178
+ checker, `qpdf`, `pdfinfo`, extracted-text review, independent page renders, and
179
+ clean-worktree check then passed.
180
+
181
+ The visual-review turn exposed a reusable provider-boundary defect: automatic
182
+ `read_image` was blocked merely because DeepSeek was the active reasoning
183
+ provider, even though the configured local image-perception handoff was safe
184
+ and the perception runtime already supported it. Guardrails now allow the
185
+ DeepSeek-to-LocalLLM handoff when local perception is enabled, continue to block
186
+ hosted vision without explicit authorization, and block all automatic vision
187
+ when both local and hosted routes are disabled. A focused regression covers the
188
+ guard and the actual LocalLLM client route.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazyingart/agintiflow",
3
- "version": "0.20.214",
3
+ "version": "0.20.215",
4
4
  "type": "module",
5
5
  "description": "AgInTiFlow is a project-aware agent workspace for hybrid wet-dry R&D, hardware-aware intelligence, software automation, and industrial workflows.",
6
6
  "license": "Apache-2.0",
@@ -83,6 +83,36 @@ async function verifyProviderBoundary({ pngPath, store, config }) {
83
83
  config: { ...config, provider: "localllm", allowHostedImagePerception: false },
84
84
  });
85
85
  assert(!guardedImage.allowed, "guardrails allowed unapproved hosted image perception");
86
+ const guardedDeepSeekLocalHandoff = checkToolUse({
87
+ toolName: "read_image",
88
+ args: { path: path.relative(config.commandCwd, pngPath) },
89
+ snapshot: { elements: [] },
90
+ config: {
91
+ ...config,
92
+ provider: "deepseek",
93
+ allowLocalImagePerception: true,
94
+ allowHostedImagePerception: false,
95
+ },
96
+ });
97
+ assert(
98
+ guardedDeepSeekLocalHandoff.allowed,
99
+ "guardrails blocked the safe DeepSeek-to-LocalLLM image handoff"
100
+ );
101
+ const blockedDeepSeekWithoutHandoff = checkToolUse({
102
+ toolName: "read_image",
103
+ args: { path: path.relative(config.commandCwd, pngPath) },
104
+ snapshot: { elements: [] },
105
+ config: {
106
+ ...config,
107
+ provider: "deepseek",
108
+ allowLocalImagePerception: false,
109
+ allowHostedImagePerception: false,
110
+ },
111
+ });
112
+ assert(
113
+ !blockedDeepSeekWithoutHandoff.allowed,
114
+ "guardrails allowed auto image perception after every backend handoff was disabled"
115
+ );
86
116
  const guardedResearch = checkToolUse({
87
117
  toolName: "web_research",
88
118
  args: { query: "provider boundary smoke", mode: "openai" },
package/src/guardrails.js CHANGED
@@ -230,11 +230,12 @@ export function checkToolUse({ toolName, args, snapshot, config }) {
230
230
  !args.dryRun &&
231
231
  ["", "auto", "default"].includes(provider) &&
232
232
  !["localllm", "openai"].includes(activeProvider) &&
233
+ config.allowLocalImagePerception === false &&
233
234
  config.allowHostedImagePerception !== true
234
235
  ) {
235
236
  return {
236
237
  allowed: false,
237
- reason: `No automatic image-reading backend is enabled for active provider ${activeProvider}. Select localllm or explicitly enable a hosted image backend.`,
238
+ reason: `No automatic image-reading backend is enabled for active provider ${activeProvider}. Enable the local image-perception handoff, select localllm, or explicitly enable a hosted image backend.`,
238
239
  category: "perception-tools",
239
240
  };
240
241
  }