deepclause-sdk 0.0.89 → 0.1.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.
Files changed (292) hide show
  1. package/README.md +417 -948
  2. package/dist/agent.d.ts +18 -2
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +74 -21
  5. package/dist/agent.js.map +1 -1
  6. package/dist/cli/config.d.ts +323 -176
  7. package/dist/cli/config.d.ts.map +1 -1
  8. package/dist/cli/config.js +146 -188
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/index.d.ts +3 -2
  11. package/dist/cli/index.d.ts.map +1 -1
  12. package/dist/cli/index.js +61 -425
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/cli/login.d.ts +29 -0
  15. package/dist/cli/login.d.ts.map +1 -0
  16. package/dist/cli/login.js +184 -0
  17. package/dist/cli/login.js.map +1 -0
  18. package/dist/cli/readline.d.ts +6 -0
  19. package/dist/cli/readline.d.ts.map +1 -0
  20. package/dist/cli/readline.js +15 -0
  21. package/dist/cli/readline.js.map +1 -0
  22. package/dist/cli/repl-bin.d.ts +9 -0
  23. package/dist/cli/repl-bin.d.ts.map +1 -0
  24. package/dist/cli/repl-bin.js +16 -0
  25. package/dist/cli/repl-bin.js.map +1 -0
  26. package/dist/cli/repl.d.ts +191 -0
  27. package/dist/cli/repl.d.ts.map +1 -0
  28. package/dist/cli/repl.js +1232 -0
  29. package/dist/cli/repl.js.map +1 -0
  30. package/dist/cli/run.d.ts +17 -18
  31. package/dist/cli/run.d.ts.map +1 -1
  32. package/dist/cli/run.js +196 -183
  33. package/dist/cli/run.js.map +1 -1
  34. package/dist/cli/set-backend.d.ts +53 -0
  35. package/dist/cli/set-backend.d.ts.map +1 -0
  36. package/dist/cli/set-backend.js +259 -0
  37. package/dist/cli/set-backend.js.map +1 -0
  38. package/dist/cli/visualize.d.ts +38 -0
  39. package/dist/cli/visualize.d.ts.map +1 -0
  40. package/dist/cli/visualize.js +125 -0
  41. package/dist/cli/visualize.js.map +1 -0
  42. package/dist/compiler.d.ts +5 -52
  43. package/dist/compiler.d.ts.map +1 -1
  44. package/dist/compiler.js +4 -768
  45. package/dist/compiler.js.map +1 -1
  46. package/dist/index.d.ts +27 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +18 -2
  49. package/dist/index.js.map +1 -1
  50. package/dist/prolog/bridge.d.ts +3 -1
  51. package/dist/prolog/bridge.d.ts.map +1 -1
  52. package/dist/prolog/bridge.js +8 -1
  53. package/dist/prolog/bridge.js.map +1 -1
  54. package/dist/prolog-src/deepclause_analysis.pl +10 -2
  55. package/dist/prolog-src/deepclause_mi.pl +2245 -41
  56. package/dist/repl/agent.d.ts +72 -0
  57. package/dist/repl/agent.d.ts.map +1 -0
  58. package/dist/repl/agent.js +366 -0
  59. package/dist/repl/agent.js.map +1 -0
  60. package/dist/repl/auth.d.ts +45 -0
  61. package/dist/repl/auth.d.ts.map +1 -0
  62. package/dist/repl/auth.js +116 -0
  63. package/dist/repl/auth.js.map +1 -0
  64. package/dist/repl/backend.d.ts +290 -0
  65. package/dist/repl/backend.d.ts.map +1 -0
  66. package/dist/repl/backend.js +370 -0
  67. package/dist/repl/backend.js.map +1 -0
  68. package/dist/repl/compaction.d.ts +122 -0
  69. package/dist/repl/compaction.d.ts.map +1 -0
  70. package/dist/repl/compaction.js +318 -0
  71. package/dist/repl/compaction.js.map +1 -0
  72. package/dist/repl/export.d.ts +30 -0
  73. package/dist/repl/export.d.ts.map +1 -0
  74. package/dist/repl/export.js +23 -0
  75. package/dist/repl/export.js.map +1 -0
  76. package/dist/repl/frames.d.ts +21 -0
  77. package/dist/repl/frames.d.ts.map +1 -0
  78. package/dist/repl/frames.js +79 -0
  79. package/dist/repl/frames.js.map +1 -0
  80. package/dist/repl/harness-tools.d.ts +74 -0
  81. package/dist/repl/harness-tools.d.ts.map +1 -0
  82. package/dist/repl/harness-tools.js +121 -0
  83. package/dist/repl/harness-tools.js.map +1 -0
  84. package/dist/repl/highlight.d.ts +30 -0
  85. package/dist/repl/highlight.d.ts.map +1 -0
  86. package/dist/repl/highlight.js +285 -0
  87. package/dist/repl/highlight.js.map +1 -0
  88. package/dist/repl/history.d.ts +234 -0
  89. package/dist/repl/history.d.ts.map +1 -0
  90. package/dist/repl/history.js +661 -0
  91. package/dist/repl/history.js.map +1 -0
  92. package/dist/repl/index.d.ts +120 -0
  93. package/dist/repl/index.d.ts.map +1 -0
  94. package/dist/repl/index.js +107 -0
  95. package/dist/repl/index.js.map +1 -0
  96. package/dist/repl/judge.d.ts +51 -0
  97. package/dist/repl/judge.d.ts.map +1 -0
  98. package/dist/repl/judge.js +58 -0
  99. package/dist/repl/judge.js.map +1 -0
  100. package/dist/repl/markdown.d.ts +25 -0
  101. package/dist/repl/markdown.d.ts.map +1 -0
  102. package/dist/repl/markdown.js +103 -0
  103. package/dist/repl/markdown.js.map +1 -0
  104. package/dist/repl/picker.d.ts +34 -0
  105. package/dist/repl/picker.d.ts.map +1 -0
  106. package/dist/repl/picker.js +81 -0
  107. package/dist/repl/picker.js.map +1 -0
  108. package/dist/repl/project-context.d.ts +16 -0
  109. package/dist/repl/project-context.d.ts.map +1 -0
  110. package/dist/repl/project-context.js +23 -0
  111. package/dist/repl/project-context.js.map +1 -0
  112. package/dist/repl/render.d.ts +160 -0
  113. package/dist/repl/render.d.ts.map +1 -0
  114. package/dist/repl/render.js +715 -0
  115. package/dist/repl/render.js.map +1 -0
  116. package/dist/repl/session.d.ts +356 -0
  117. package/dist/repl/session.d.ts.map +1 -0
  118. package/dist/repl/session.js +1275 -0
  119. package/dist/repl/session.js.map +1 -0
  120. package/dist/repl/status.d.ts +100 -0
  121. package/dist/repl/status.d.ts.map +1 -0
  122. package/dist/repl/status.js +218 -0
  123. package/dist/repl/status.js.map +1 -0
  124. package/dist/repl/tools.d.ts +53 -0
  125. package/dist/repl/tools.d.ts.map +1 -0
  126. package/dist/repl/tools.js +307 -0
  127. package/dist/repl/tools.js.map +1 -0
  128. package/dist/repl/toolset.d.ts +32 -0
  129. package/dist/repl/toolset.d.ts.map +1 -0
  130. package/dist/repl/toolset.js +82 -0
  131. package/dist/repl/toolset.js.map +1 -0
  132. package/dist/repl/tui/editor.d.ts +17 -0
  133. package/dist/repl/tui/editor.d.ts.map +1 -0
  134. package/dist/repl/tui/editor.js +39 -0
  135. package/dist/repl/tui/editor.js.map +1 -0
  136. package/dist/repl/tui/status-bar.d.ts +26 -0
  137. package/dist/repl/tui/status-bar.d.ts.map +1 -0
  138. package/dist/repl/tui/status-bar.js +47 -0
  139. package/dist/repl/tui/status-bar.js.map +1 -0
  140. package/dist/repl/tui/theme.d.ts +30 -0
  141. package/dist/repl/tui/theme.d.ts.map +1 -0
  142. package/dist/repl/tui/theme.js +81 -0
  143. package/dist/repl/tui/theme.js.map +1 -0
  144. package/dist/repl/tui/transcript.d.ts +39 -0
  145. package/dist/repl/tui/transcript.d.ts.map +1 -0
  146. package/dist/repl/tui/transcript.js +123 -0
  147. package/dist/repl/tui/transcript.js.map +1 -0
  148. package/dist/runner.d.ts +132 -13
  149. package/dist/runner.d.ts.map +1 -1
  150. package/dist/runner.js +434 -277
  151. package/dist/runner.js.map +1 -1
  152. package/dist/sdk.d.ts.map +1 -1
  153. package/dist/sdk.js +0 -32
  154. package/dist/sdk.js.map +1 -1
  155. package/dist/system/assets/docs/AGENT_PROMPT.md +1373 -0
  156. package/dist/system/assets/docs/DML_AUTHORING.md +195 -0
  157. package/dist/system/assets/docs/DML_REFERENCE.md +312 -72
  158. package/dist/system/assets/docs/HARNESS_EXAMPLES.md +172 -0
  159. package/dist/system/assets/docs/HARNESS_PATTERNS.md +562 -0
  160. package/dist/system/assets/docs/META_PROMPT.md +68 -0
  161. package/dist/system/assets/docs/PROLOG_SNIPPETS.md +117 -0
  162. package/dist/system/assets/index.d.ts +9 -17
  163. package/dist/system/assets/index.d.ts.map +1 -1
  164. package/dist/system/assets/index.js +26 -85
  165. package/dist/system/assets/index.js.map +1 -1
  166. package/dist/system/runtime/agentvm-manager.d.ts +9 -2
  167. package/dist/system/runtime/agentvm-manager.d.ts.map +1 -1
  168. package/dist/system/runtime/agentvm-manager.js +70 -44
  169. package/dist/system/runtime/agentvm-manager.js.map +1 -1
  170. package/dist/system/runtime/media.d.ts +23 -0
  171. package/dist/system/runtime/media.d.ts.map +1 -0
  172. package/dist/system/runtime/media.js +55 -0
  173. package/dist/system/runtime/media.js.map +1 -0
  174. package/dist/system/runtime/shell-limits.d.ts +21 -0
  175. package/dist/system/runtime/shell-limits.d.ts.map +1 -0
  176. package/dist/system/runtime/shell-limits.js +39 -0
  177. package/dist/system/runtime/shell-limits.js.map +1 -0
  178. package/dist/system/runtime/shell-manager.d.ts +8 -3
  179. package/dist/system/runtime/shell-manager.d.ts.map +1 -1
  180. package/dist/system/runtime/shell-manager.js +56 -39
  181. package/dist/system/runtime/shell-manager.js.map +1 -1
  182. package/dist/system/runtime/shell-tool-events.js +5 -0
  183. package/dist/system/runtime/shell-tool-events.js.map +1 -1
  184. package/dist/system/runtime/token-usage.d.ts +2 -0
  185. package/dist/system/runtime/token-usage.d.ts.map +1 -1
  186. package/dist/system/runtime/token-usage.js +7 -0
  187. package/dist/system/runtime/token-usage.js.map +1 -1
  188. package/dist/tools.d.ts +3 -21
  189. package/dist/tools.d.ts.map +1 -1
  190. package/dist/tools.js +14 -168
  191. package/dist/tools.js.map +1 -1
  192. package/dist/types.d.ts +80 -118
  193. package/dist/types.d.ts.map +1 -1
  194. package/dist/validate.d.ts +19 -0
  195. package/dist/validate.d.ts.map +1 -0
  196. package/dist/validate.js +338 -0
  197. package/dist/validate.js.map +1 -0
  198. package/dist/visualize/index.d.ts +52 -0
  199. package/dist/visualize/index.d.ts.map +1 -0
  200. package/dist/visualize/index.js +189 -0
  201. package/dist/visualize/index.js.map +1 -0
  202. package/package.json +17 -15
  203. package/src/prolog-src/deepclause_analysis.pl +10 -2
  204. package/src/prolog-src/deepclause_mi.pl +2245 -41
  205. package/dist/cli/commands.d.ts +0 -42
  206. package/dist/cli/commands.d.ts.map +0 -1
  207. package/dist/cli/commands.js +0 -246
  208. package/dist/cli/commands.js.map +0 -1
  209. package/dist/cli/compile.d.ts +0 -99
  210. package/dist/cli/compile.d.ts.map +0 -1
  211. package/dist/cli/compile.js +0 -363
  212. package/dist/cli/compile.js.map +0 -1
  213. package/dist/cli/default-skills.d.ts +0 -10
  214. package/dist/cli/default-skills.d.ts.map +0 -1
  215. package/dist/cli/default-skills.js +0 -206
  216. package/dist/cli/default-skills.js.map +0 -1
  217. package/dist/cli/interactive.d.ts +0 -2
  218. package/dist/cli/interactive.d.ts.map +0 -1
  219. package/dist/cli/interactive.js +0 -20
  220. package/dist/cli/interactive.js.map +0 -1
  221. package/dist/cli/mcp.d.ts +0 -56
  222. package/dist/cli/mcp.d.ts.map +0 -1
  223. package/dist/cli/mcp.js +0 -138
  224. package/dist/cli/mcp.js.map +0 -1
  225. package/dist/cli/prompt.d.ts +0 -2
  226. package/dist/cli/prompt.d.ts.map +0 -1
  227. package/dist/cli/prompt.js +0 -2
  228. package/dist/cli/prompt.js.map +0 -1
  229. package/dist/cli/search.d.ts +0 -19
  230. package/dist/cli/search.d.ts.map +0 -1
  231. package/dist/cli/search.js +0 -189
  232. package/dist/cli/search.js.map +0 -1
  233. package/dist/cli/tool-args.d.ts +0 -2
  234. package/dist/cli/tool-args.d.ts.map +0 -1
  235. package/dist/cli/tool-args.js +0 -39
  236. package/dist/cli/tool-args.js.map +0 -1
  237. package/dist/cli/tools.d.ts +0 -36
  238. package/dist/cli/tools.d.ts.map +0 -1
  239. package/dist/cli/tools.js +0 -229
  240. package/dist/cli/tools.js.map +0 -1
  241. package/dist/cli/tui/index.d.ts +0 -22
  242. package/dist/cli/tui/index.d.ts.map +0 -1
  243. package/dist/cli/tui/index.js +0 -29
  244. package/dist/cli/tui/index.js.map +0 -1
  245. package/dist/cli/tui.d.ts +0 -167
  246. package/dist/cli/tui.d.ts.map +0 -1
  247. package/dist/cli/tui.js +0 -5228
  248. package/dist/cli/tui.js.map +0 -1
  249. package/dist/compiler_prompt.d.ts +0 -20
  250. package/dist/compiler_prompt.d.ts.map +0 -1
  251. package/dist/compiler_prompt.js +0 -870
  252. package/dist/compiler_prompt.js.map +0 -1
  253. package/dist/deepclause-cli.skill +0 -0
  254. package/dist/prolog-src/deepclause_mi.pl.bak +0 -570
  255. package/dist/system/assets/docs/CONDUCTOR_PROMPT.md +0 -105
  256. package/dist/system/assets/docs/DML_COMPILER_PROMPT.md +0 -700
  257. package/dist/system/assets/docs/TUI.md +0 -150
  258. package/dist/system/assets/recipes/deepclause-coding-workflow/SKILL.md +0 -100
  259. package/dist/system/assets/skills/conductor.dml +0 -76
  260. package/dist/system/assets/skills/deep-planner.dml +0 -412
  261. package/dist/system/assets/skills/plan.dml +0 -429
  262. package/dist/system/assets/skills/security-planner.dml +0 -337
  263. package/dist/system/assets/skills/skill-creator.dml +0 -187
  264. package/dist/system/runtime/catalog-recipes.d.ts +0 -24
  265. package/dist/system/runtime/catalog-recipes.d.ts.map +0 -1
  266. package/dist/system/runtime/catalog-recipes.js +0 -273
  267. package/dist/system/runtime/catalog-recipes.js.map +0 -1
  268. package/dist/system/runtime/catalog-skills.d.ts +0 -50
  269. package/dist/system/runtime/catalog-skills.d.ts.map +0 -1
  270. package/dist/system/runtime/catalog-skills.js +0 -152
  271. package/dist/system/runtime/catalog-skills.js.map +0 -1
  272. package/dist/system/runtime/conductor.d.ts +0 -105
  273. package/dist/system/runtime/conductor.d.ts.map +0 -1
  274. package/dist/system/runtime/conductor.js +0 -732
  275. package/dist/system/runtime/conductor.js.map +0 -1
  276. package/dist/system/runtime/console-capture.d.ts +0 -9
  277. package/dist/system/runtime/console-capture.d.ts.map +0 -1
  278. package/dist/system/runtime/console-capture.js +0 -67
  279. package/dist/system/runtime/console-capture.js.map +0 -1
  280. package/dist/system/runtime/dml-executor.d.ts +0 -52
  281. package/dist/system/runtime/dml-executor.d.ts.map +0 -1
  282. package/dist/system/runtime/dml-executor.js +0 -203
  283. package/dist/system/runtime/dml-executor.js.map +0 -1
  284. package/dist/system/runtime/runtime-tools.d.ts +0 -31
  285. package/dist/system/runtime/runtime-tools.d.ts.map +0 -1
  286. package/dist/system/runtime/runtime-tools.js +0 -312
  287. package/dist/system/runtime/runtime-tools.js.map +0 -1
  288. package/dist/system/runtime/skill-creator.d.ts +0 -38
  289. package/dist/system/runtime/skill-creator.d.ts.map +0 -1
  290. package/dist/system/runtime/skill-creator.js +0 -763
  291. package/dist/system/runtime/skill-creator.js.map +0 -1
  292. package/src/prolog-src/deepclause_mi.pl.bak +0 -570
@@ -0,0 +1,172 @@
1
+ # Idiomatic harness examples
2
+
3
+ Copy-paste shapes for REPL harnesses. Keep each skill small and compose them.
4
+ (The snippets are tested against the bundled SWI-Prolog.)
5
+
6
+ Most skills should look like §2–§3: a short sequence of `task/N`/`prompt/N` calls
7
+ with thin guards between them. §4–§7 (facts, pure logic, judgments, CLP) are the
8
+ exception — reach for them only when the task is genuinely data- or
9
+ logic-shaped, not as the default style. DML is the orchestration layer over model
10
+ calls, not the logic library (`DML_AUTHORING.md` §0). For file work, shell out
11
+ (`exec(bash(...))`) instead of reading files into DML (§2).
12
+
13
+ Every skill carries a `doc(Name/Arity, Text)` annotation and the harness a
14
+ `module_doc(Text)` line (`DML_AUTHORING.md` §4). `module_doc/1` is the harness's
15
+ **skill description** — what it does and when to use it; it is the first line of
16
+ the manifest, which the agent reads at session start and whenever it changes. A
17
+ file with only `module_doc/1` is still a valid skill (an advertised capability
18
+ with an empty body). Keep both terse.
19
+
20
+ ```prolog
21
+ module_doc("Example harness: a few small skills used as patterns. Use when you need a copy-paste starting point.").
22
+ ```
23
+
24
+ ## 1. Wrap a workspace script as a tool
25
+
26
+ Materialize the program as a workspace file (run a DML goal with
27
+ `make_directory_path("scripts"), write_file("scripts/count_words.py", "…")`),
28
+ link it with `script_file/2`, and define a predicate for it. `tool/2` is only an
29
+ annotation that exposes an existing predicate to `task/N`; keep it a one-line
30
+ delegation so the predicate is also callable from `execute` / `/goal`:
31
+
32
+ ```prolog
33
+ script_file(count_words, ".dc-repl/scripts/count_words.py").
34
+
35
+ % The capability: callable from `execute` / `/goal` and from `task/N`.
36
+ count_words(File, Count) :-
37
+ script_file(count_words, Script),
38
+ format(atom(Cmd), "python3 '~w' '~w'", [Script, File]),
39
+ exec(bash(command: Cmd), Result),
40
+ get_dict(stdout, Result, Count).
41
+
42
+ % The annotation exposing it to the nested agent (delegation only).
43
+ tool(count_words(File, Count), "Count words in a workspace file.") :-
44
+ count_words(File, Count).
45
+ ```
46
+
47
+ Untrusted data goes through files/stdin, never interpolated into the shell
48
+ command. `script_file/2` is just a fact (the exporter bundles the file); the
49
+ write lands on disk immediately, so `bash` can run the script in the same turn.
50
+
51
+ ## 2. A skill that calls the model
52
+
53
+ `task/N` runs a bounded agentic turn. Name each output variable in the
54
+ description so the model fills it:
55
+
56
+ ```prolog
57
+ doc(classify/2, "Route a support message. classify(+Message, -Team). Example: /goal classify(\"I was charged twice\", T).").
58
+
59
+ classify(Message, Team) :-
60
+ task("Route this support message to exactly one of billing, orders, or account. Message: {Message}. Store the choice in Team.", Team).
61
+
62
+ demo :-
63
+ classify("I was charged twice for the same order", Team),
64
+ format(string(Out), "Routed to ~w", [Team]),
65
+ answer(Out).
66
+ ```
67
+
68
+ ## 3. Multi-step pipeline: task -> task -> answer
69
+
70
+ ```prolog
71
+ report(Topic, Result) :-
72
+ task("List three risks of using an LLM for arithmetic. Store them in Risks.", Risks),
73
+ format(string(Desc), "Rank these risks and explain the top one: ~w", [Risks]),
74
+ task(Desc, Top),
75
+ format(string(Result), "Top risk: ~w", [Top]).
76
+ ```
77
+
78
+ Compose the steps and let the model do the thinking; keep only thin guards
79
+ between them — an if-then-else for a branch, `once/1` to commit the first
80
+ answer, or a simple check that fails a step:
81
+
82
+ ```prolog
83
+ summarise(Doc, Summary) :-
84
+ task("Extract the document's main claim. Store it in Claim.", Claim),
85
+ ( Claim == ""
86
+ -> Summary = "no claim found"
87
+ ; task("Summarise this claim in one sentence: {Claim}", Summary)
88
+ ).
89
+ ```
90
+
91
+ ## 4. Data as facts (data = code)
92
+
93
+ Small/medium data belongs in the module and is queried exactly like code:
94
+
95
+ ```prolog
96
+ parent(alice, bob).
97
+ parent(alice, carol).
98
+ parent(bob, dave).
99
+ parent(carol, eve).
100
+
101
+ doc(ancestor/2, "Transitive parent. ancestor(+A, -B) enumerates descendants. Example: /goal ancestor(alice, X).").
102
+
103
+ ancestor(A, B) :- parent(A, B).
104
+ ancestor(A, B) :- parent(A, C), ancestor(C, B).
105
+ ```
106
+
107
+ ```text
108
+ /goal ancestor(alice, X).
109
+ X = bob ; X = carol ; X = dave ; X = eve
110
+ ```
111
+
112
+ ## 5. Pure logic + a test predicate
113
+
114
+ ```prolog
115
+ doc(tally/2, "Count occurrences of each item. tally(+List, -Counts) yields Key-N pairs. Example: /goal tally([a,b,a,c,a], C).").
116
+
117
+ tally(List, Counts) :-
118
+ list_to_set(List, Items),
119
+ findall(Item-N, (member(Item, Items), aggregate_all(count, member(Item, List), N)), Counts).
120
+
121
+ test_tally :-
122
+ tally([a,b,a,c,a], C),
123
+ C == [a-3, b-1, c-1].
124
+ ```
125
+
126
+ `/goal test_tally.` succeeds when the behavior is correct. When a skill changes,
127
+ update or add its test and run it (`execute` during a turn, or `/goal`).
128
+
129
+ ## 6. Semantic judgments (the model decides, Prolog enforces)
130
+
131
+ ```prolog
132
+ route(Message, Team) :-
133
+ choose(Message, "Which team should handle this?", [billing, orders, account], Team).
134
+
135
+ urgent(Message) :-
136
+ holds(Message, "Is this urgent?").
137
+ ```
138
+
139
+ `choose/4` always returns one of your options; `verify/3` is three-valued
140
+ (`yes`/`no`/`unknown`); `holds/2` is the semidet wrapper.
141
+
142
+ ## 7. Constraints with CLP(FD)
143
+
144
+ ```prolog
145
+ :- use_module(library(clpfd)).
146
+
147
+ doc(solve/3, "X+Y=Total with X<Y over 0..100. solve(+Total, -X, -Y). Example: /goal solve(10, X, Y).").
148
+
149
+ solve(Total, X, Y) :-
150
+ [X, Y] ins 0..100,
151
+ X + Y #= Total,
152
+ X #< Y,
153
+ label([X, Y]).
154
+ ```
155
+
156
+ The `:- use_module(...)` directive must be **top-level** (an inline
157
+ `use_module` inside a body is not run at read time, so `#=`/`ins` are unknown).
158
+
159
+ ## 8. Vision: describe a workspace image
160
+
161
+ ```prolog
162
+ doc(describe_image/2, "Describe an image file. describe_image(+Path, -Text). Example: /goal describe_image(\"photos/fox.png\", T).").
163
+
164
+ describe_image(Path, Text) :-
165
+ read_media(Path, Image), % media(Path, Mime) — no bytes
166
+ attach_media(Image), % reference-only; sent by the next task/N
167
+ task("Describe the attached image in one sentence.", Text).
168
+ ```
169
+
170
+ Images are files; `media(Path, Mime)` is the reference. The bytes are read from
171
+ the workspace at call time, only PNG/JPEG/GIF/WebP are accepted, and they never
172
+ enter clauses or memory. Judgments stay text-only.