deepclause-sdk 0.1.0 → 0.1.1

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 (106) hide show
  1. package/README.md +83 -12
  2. package/dist/agent.d.ts +2 -1
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +1 -0
  5. package/dist/agent.js.map +1 -1
  6. package/dist/cli/config.d.ts +62 -2
  7. package/dist/cli/config.d.ts.map +1 -1
  8. package/dist/cli/config.js +15 -0
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/index.js +38 -0
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/repl.d.ts +25 -0
  13. package/dist/cli/repl.d.ts.map +1 -1
  14. package/dist/cli/repl.js +165 -5
  15. package/dist/cli/repl.js.map +1 -1
  16. package/dist/cli/run.d.ts.map +1 -1
  17. package/dist/cli/run.js +6 -0
  18. package/dist/cli/run.js.map +1 -1
  19. package/dist/cli/visualize.d.ts +4 -0
  20. package/dist/cli/visualize.d.ts.map +1 -1
  21. package/dist/cli/visualize.js +29 -4
  22. package/dist/cli/visualize.js.map +1 -1
  23. package/dist/prolog/bridge.d.ts +3 -1
  24. package/dist/prolog/bridge.d.ts.map +1 -1
  25. package/dist/prolog/bridge.js +2 -0
  26. package/dist/prolog/bridge.js.map +1 -1
  27. package/dist/prolog-src/deepclause_mi.pl +196 -9
  28. package/dist/repl/agent.d.ts +18 -0
  29. package/dist/repl/agent.d.ts.map +1 -1
  30. package/dist/repl/agent.js +47 -3
  31. package/dist/repl/agent.js.map +1 -1
  32. package/dist/repl/backend.d.ts +31 -0
  33. package/dist/repl/backend.d.ts.map +1 -1
  34. package/dist/repl/backend.js +122 -77
  35. package/dist/repl/backend.js.map +1 -1
  36. package/dist/repl/harness-tools.d.ts +25 -0
  37. package/dist/repl/harness-tools.d.ts.map +1 -1
  38. package/dist/repl/harness-tools.js +73 -2
  39. package/dist/repl/harness-tools.js.map +1 -1
  40. package/dist/repl/imagegen.d.ts +29 -0
  41. package/dist/repl/imagegen.d.ts.map +1 -0
  42. package/dist/repl/imagegen.js +84 -0
  43. package/dist/repl/imagegen.js.map +1 -0
  44. package/dist/repl/index.d.ts +12 -2
  45. package/dist/repl/index.d.ts.map +1 -1
  46. package/dist/repl/index.js +5 -0
  47. package/dist/repl/index.js.map +1 -1
  48. package/dist/repl/model-resolver.d.ts +59 -0
  49. package/dist/repl/model-resolver.d.ts.map +1 -0
  50. package/dist/repl/model-resolver.js +156 -0
  51. package/dist/repl/model-resolver.js.map +1 -0
  52. package/dist/repl/render.d.ts +28 -1
  53. package/dist/repl/render.d.ts.map +1 -1
  54. package/dist/repl/render.js +94 -1
  55. package/dist/repl/render.js.map +1 -1
  56. package/dist/repl/session.d.ts +68 -0
  57. package/dist/repl/session.d.ts.map +1 -1
  58. package/dist/repl/session.js +206 -8
  59. package/dist/repl/session.js.map +1 -1
  60. package/dist/repl/tui/transcript.d.ts +2 -0
  61. package/dist/repl/tui/transcript.d.ts.map +1 -1
  62. package/dist/repl/tui/transcript.js +16 -0
  63. package/dist/repl/tui/transcript.js.map +1 -1
  64. package/dist/runner.d.ts +13 -2
  65. package/dist/runner.d.ts.map +1 -1
  66. package/dist/runner.js +101 -16
  67. package/dist/runner.js.map +1 -1
  68. package/dist/system/assets/docs/AGENT_PROMPT.md +75 -1
  69. package/dist/system/assets/docs/DML_REFERENCE.md +32 -0
  70. package/dist/types.d.ts +56 -1
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/visualize/ascii.d.ts +55 -0
  73. package/dist/visualize/ascii.d.ts.map +1 -0
  74. package/dist/visualize/ascii.js +242 -0
  75. package/dist/visualize/ascii.js.map +1 -0
  76. package/dist/visualize/display.d.ts +24 -0
  77. package/dist/visualize/display.d.ts.map +1 -0
  78. package/dist/visualize/display.js +29 -0
  79. package/dist/visualize/display.js.map +1 -0
  80. package/dist/visualize/graphics.d.ts +35 -0
  81. package/dist/visualize/graphics.d.ts.map +1 -0
  82. package/dist/visualize/graphics.js +96 -0
  83. package/dist/visualize/graphics.js.map +1 -0
  84. package/dist/visualize/image.d.ts +38 -0
  85. package/dist/visualize/image.d.ts.map +1 -0
  86. package/dist/visualize/image.js +95 -0
  87. package/dist/visualize/image.js.map +1 -0
  88. package/dist/visualize/index.d.ts +7 -0
  89. package/dist/visualize/index.d.ts.map +1 -1
  90. package/dist/visualize/index.js +9 -0
  91. package/dist/visualize/index.js.map +1 -1
  92. package/dist/visualize/raster.d.ts +23 -0
  93. package/dist/visualize/raster.d.ts.map +1 -0
  94. package/dist/visualize/raster.js +47 -0
  95. package/dist/visualize/raster.js.map +1 -0
  96. package/dist/visualize/svg.d.ts +39 -0
  97. package/dist/visualize/svg.d.ts.map +1 -0
  98. package/dist/visualize/svg.js +148 -0
  99. package/dist/visualize/svg.js.map +1 -0
  100. package/dist/visualize/transcode.d.ts +13 -0
  101. package/dist/visualize/transcode.d.ts.map +1 -0
  102. package/dist/visualize/transcode.js +40 -0
  103. package/dist/visualize/transcode.js.map +1 -0
  104. package/docs/images/repl.png +0 -0
  105. package/package.json +7 -5
  106. package/src/prolog-src/deepclause_mi.pl +196 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/visualize/svg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Optional raster transcoding (JPEG/WebP/GIF → PNG) for terminal display.
3
+ *
4
+ * PNG passes through untouched and SVG is handled by resvg (`raster.ts`); the
5
+ * other formats need a decoder. `sharp` is loaded lazily and is not a hard
6
+ * dependency — when it is unavailable those formats fall back to the
7
+ * path + external-open behaviour.
8
+ */
9
+ /** True when a raster transcoder is available. */
10
+ export declare function transcoderAvailable(): Promise<boolean>;
11
+ /** Transcode arbitrary raster bytes to PNG, or undefined when unsupported. */
12
+ export declare function transcodeToPng(bytes: Buffer, mimeType: string): Promise<Buffer | undefined>;
13
+ //# sourceMappingURL=transcode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode.d.ts","sourceRoot":"","sources":["../../src/visualize/transcode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH,kDAAkD;AAClD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE5D;AAED,8EAA8E;AAC9E,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAcjG"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Optional raster transcoding (JPEG/WebP/GIF → PNG) for terminal display.
3
+ *
4
+ * PNG passes through untouched and SVG is handled by resvg (`raster.ts`); the
5
+ * other formats need a decoder. `sharp` is loaded lazily and is not a hard
6
+ * dependency — when it is unavailable those formats fall back to the
7
+ * path + external-open behaviour.
8
+ */
9
+ async function loadSharp() {
10
+ // Variable specifier keeps this compiling when the optional dep is absent.
11
+ const specifier = 'sharp';
12
+ try {
13
+ return (await import(specifier));
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ /** True when a raster transcoder is available. */
20
+ export async function transcoderAvailable() {
21
+ return (await loadSharp()) !== undefined;
22
+ }
23
+ /** Transcode arbitrary raster bytes to PNG, or undefined when unsupported. */
24
+ export async function transcodeToPng(bytes, mimeType) {
25
+ if (mimeType === 'image/png') {
26
+ return bytes;
27
+ }
28
+ const sharp = await loadSharp();
29
+ if (!sharp) {
30
+ return undefined;
31
+ }
32
+ try {
33
+ const factory = sharp.default ?? sharp;
34
+ return await factory(bytes).png().toBuffer();
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ //# sourceMappingURL=transcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode.js","sourceRoot":"","sources":["../../src/visualize/transcode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,KAAK,UAAU,SAAS;IACtB,2EAA2E;IAC3E,MAAM,SAAS,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAA2B,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,CAAC,MAAM,SAAS,EAAE,CAAC,KAAK,SAAS,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,QAAgB;IAClE,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QACvC,OAAO,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "deepclause-sdk",
3
- "version": "0.1.0",
4
- "description": "Neuro-symbolic runtime: a self-modifying DML/Prolog REPL, one-shot runner, and TypeScript SDK",
3
+ "version": "0.1.1",
4
+ "description": "Neuro-symbolic runtime: a self-modifying DML/Prolog REPL, one-shot runner, and TypeScript SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -40,12 +40,13 @@
40
40
  "cli": "tsx src/cli/index.ts"
41
41
  },
42
42
  "dependencies": {
43
- "@earendil-works/pi-ai": "^1.0.4",
44
- "@earendil-works/pi-coding-agent": "^1.0.4",
45
- "@earendil-works/pi-tui": "^1.0.4",
46
43
  "@ai-sdk/anthropic": "^3.0.35",
47
44
  "@ai-sdk/google": "^3.0.60",
48
45
  "@ai-sdk/openai": "^3.0.25",
46
+ "@resvg/resvg-js": "^2.6.2",
47
+ "@earendil-works/pi-ai": "^1.0.4",
48
+ "@earendil-works/pi-coding-agent": "^1.0.4",
49
+ "@earendil-works/pi-tui": "^1.0.4",
49
50
  "ai": "^6.0.116",
50
51
  "commander": "^12.1.0",
51
52
  "deepclause-agentvm": "^0.0.5",
@@ -68,6 +69,7 @@
68
69
  },
69
70
  "files": [
70
71
  "dist",
72
+ "docs/images",
71
73
  "src/prolog-src",
72
74
  "vendor/swipl-wasm/dist",
73
75
  "vendor/swipl-wasm/package.json",
@@ -71,6 +71,7 @@
71
71
  repl_user_predicates/2,
72
72
  repl_user_predicates_text/2,
73
73
  repl_predicate_arities/3,
74
+ repl_probe_nondeterminism/6,
74
75
  repl_set_meta_catalog/2,
75
76
  repl_set_meta_template/2,
76
77
  repl_set_harness_examples/2,
@@ -336,6 +337,7 @@ extract_var_info(Bindings, Term, BareVar, Info) :-
336
337
  ).
337
338
 
338
339
  %% wrapper_type(?Wrapper, ?Type)
340
+ wrapper_type(media, media).
339
341
  wrapper_type(string, string).
340
342
  wrapper_type(integer, integer).
341
343
  wrapper_type(float, number).
@@ -477,6 +479,7 @@ typed_arg(Var, Info, Wrapped) :-
477
479
  typed_arg_type(Type, Var, Info, Wrapped).
478
480
  typed_arg(Var, _, Var).
479
481
 
482
+ typed_arg_type(media, Var, _, media(Var)) :- !.
480
483
  typed_arg_type(string, Var, _, Var) :- !.
481
484
  typed_arg_type(integer, Var, _, integer(Var)) :- !.
482
485
  typed_arg_type(number, Var, _, number(Var)) :- !.
@@ -2052,6 +2055,87 @@ repl_predicate_arities(SessionId, Name, Arities) :-
2052
2055
  Arities0),
2053
2056
  sort(Arities0, Arities).
2054
2057
 
2058
+ %% ============================================================
2059
+ %% Nondeterminism probe (end_turn advisory)
2060
+ %%
2061
+ %% After a commit, the host may probe each changed pure predicate: if calling it
2062
+ %% with fresh variables yields more than a threshold of solutions, the predicate
2063
+ %% is probably missing a commit (`once/1` / `!`) and would flood an `execute`.
2064
+ %% Side-effecting predicates are never run (see repl_impure_name/1), fact tables
2065
+ %% are skipped, and the search is bounded by an inference limit.
2066
+ %% ============================================================
2067
+
2068
+ %% Functors with side effects: model calls, host tools, file IO, DB mutation.
2069
+ repl_impure_name(task). repl_impure_name(prompt). repl_impure_name(exec).
2070
+ repl_impure_name(system). repl_impure_name(user). repl_impure_name(answer).
2071
+ repl_impure_name(input). repl_impure_name(output). repl_impure_name(read_media).
2072
+ repl_impure_name(attach_media). repl_impure_name(save_image). repl_impure_name(gen_image).
2073
+ repl_impure_name(judge). repl_impure_name(choose). repl_impure_name(rate).
2074
+ repl_impure_name(verify). repl_impure_name(probability).
2075
+ repl_impure_name(write_file). repl_impure_name(append_file). repl_impure_name(delete_file).
2076
+ repl_impure_name(make_directory_path). repl_impure_name(open). repl_impure_name(close).
2077
+ repl_impure_name(assert). repl_impure_name(assertz). repl_impure_name(asserta).
2078
+ repl_impure_name(retract). repl_impure_name(retractall).
2079
+ repl_impure_name(consult). repl_impure_name(use_module). repl_impure_name(load_files).
2080
+
2081
+ %% repl_body_impure(+Goal) — true when the goal tree calls a side-effecting name.
2082
+ repl_body_impure(Goal) :-
2083
+ callable(Goal),
2084
+ functor(Goal, Name, _),
2085
+ repl_impure_name(Name),
2086
+ !.
2087
+ repl_body_impure((A, _)) :- repl_body_impure(A).
2088
+ repl_body_impure((_, B)) :- repl_body_impure(B).
2089
+ repl_body_impure((A ; B)) :- ( repl_body_impure(A) ; repl_body_impure(B) ).
2090
+ repl_body_impure((A -> B)) :- ( repl_body_impure(A) ; repl_body_impure(B) ).
2091
+ repl_body_impure(\+ Goal) :- repl_body_impure(Goal).
2092
+ repl_body_impure(once(Goal)) :- repl_body_impure(Goal).
2093
+ repl_body_impure(ignore(Goal)) :- repl_body_impure(Goal).
2094
+ repl_body_impure(forall(Gen, Action)) :- ( repl_body_impure(Gen) ; repl_body_impure(Action) ).
2095
+ repl_body_impure(catch(Goal, _, Recovery)) :- ( repl_body_impure(Goal) ; repl_body_impure(Recovery) ).
2096
+ repl_body_impure(findall(_, Goal, _)) :- repl_body_impure(Goal).
2097
+ repl_body_impure(findall(_, Goal, _, _)) :- repl_body_impure(Goal).
2098
+ repl_body_impure(call_with_inference_limit(Goal, _, _)) :- repl_body_impure(Goal).
2099
+ repl_body_impure(with_output_to(_, Goal)) :- repl_body_impure(Goal).
2100
+ repl_body_impure(_:Goal) :- repl_body_impure(Goal).
2101
+
2102
+ repl_predicate_pure(SessionId, Name, Arity) :-
2103
+ functor(Head, Name, Arity),
2104
+ \+ ( clause(SessionId:Head, Body), repl_body_impure(Body) ).
2105
+
2106
+ %% True when the predicate has at least one clause with a real body (not a fact).
2107
+ repl_predicate_has_rule(SessionId, Name, Arity) :-
2108
+ functor(Head, Name, Arity),
2109
+ clause(SessionId:Head, Body),
2110
+ Body \== true,
2111
+ !.
2112
+
2113
+ %% repl_probe_nondeterminism(+SessionId, +Name, +Arity, +Threshold, +Bound, -Result)
2114
+ %% Result: one | many | timeout | data | unsafe | removed | error.
2115
+ repl_probe_nondeterminism(SessionId, Name, Arity, Threshold, Bound, Result) :-
2116
+ ( \+ current_predicate(SessionId:Name/Arity)
2117
+ -> Result = removed
2118
+ ; \+ repl_predicate_has_rule(SessionId, Name, Arity)
2119
+ -> Result = data
2120
+ ; \+ repl_predicate_pure(SessionId, Name, Arity)
2121
+ -> Result = unsafe
2122
+ ; functor(Head, Name, Arity),
2123
+ N is Threshold + 1,
2124
+ catch(
2125
+ ( with_output_to(string(_),
2126
+ call_with_inference_limit(call_nth(SessionId:Head, N), Bound, R)),
2127
+ ( R == false -> Result = one
2128
+ ; R == inference_limit_exceeded -> Result = timeout
2129
+ ; R == true -> Result = many
2130
+ ; R == (!) -> Result = many % success is returned as `!` in this build
2131
+ ; Result = error
2132
+ )
2133
+ ),
2134
+ _,
2135
+ Result = error
2136
+ )
2137
+ ).
2138
+
2055
2139
  %% repl_history_listing(+SessionId)
2056
2140
  %% Human-readable tail for `listing(history)`.
2057
2141
  repl_history_listing(SessionId) :-
@@ -2463,8 +2547,15 @@ step_engine(SessionId, Status, Content, Payload) :-
2463
2547
 
2464
2548
  %% process_engine_result(+Result, -Status, -Content, -Payload)
2465
2549
  process_engine_result(output(Text), output, Text, none) :- !.
2550
+ process_engine_result(media(Payload), media, '', Payload) :- is_dict(Payload), !.
2466
2551
  process_engine_result(log(Text), log, Text, none) :- !.
2467
2552
  process_engine_result(answer(Text), answer, Text, none) :- !.
2553
+ %% Current 8-arg format (with model spec from with_model/2)
2554
+ process_engine_result(request_agent_loop(Desc, Vars, Tools, Memory, ToolScope, ReasoningEffort, RecipeContext, ModelSpec), request_agent_loop, '',
2555
+ payload{taskDescription: Desc, outputVars: Vars, userTools: Tools, memory: Memory, toolScope: ToolScope, reasoningEffort: ReasoningEffort, recipeContext: RecipeContext, modelSpec: ModelSpec}) :- !.
2556
+ %% Prompt-family 6-arg format (tool scope + model spec; no reasoning/recipe)
2557
+ process_engine_result(request_agent_loop(Desc, Vars, Tools, Memory, ToolScope, ModelSpec), request_agent_loop, '',
2558
+ payload{taskDescription: Desc, outputVars: Vars, userTools: Tools, memory: Memory, toolScope: ToolScope, reasoningEffort: none, recipeContext: "", modelSpec: ModelSpec}) :- !.
2468
2559
  %% Note: Memory and tool scope are now passed in the payload for the agent loop
2469
2560
  process_engine_result(request_agent_loop(Desc, Vars, Tools, Memory, ToolScope, ReasoningEffort, RecipeContext), request_agent_loop, '',
2470
2561
  payload{taskDescription: Desc, outputVars: Vars, userTools: Tools, memory: Memory, toolScope: ToolScope, reasoningEffort: ReasoningEffort, recipeContext: RecipeContext}) :- !.
@@ -2476,10 +2567,14 @@ process_engine_result(request_agent_loop(Desc, Vars, Tools, Memory), request_age
2476
2567
  payload{taskDescription: Desc, outputVars: Vars, userTools: Tools, memory: Memory, toolScope: none, reasoningEffort: none, recipeContext: ""}) :- !.
2477
2568
  process_engine_result(request_exec(Tool, Args), request_exec, '',
2478
2569
  payload{toolName: Tool, args: Args}) :- !.
2570
+ process_engine_result(request_sample_token(Prompt, Allowed, ModelSpec), request_sample_token, '',
2571
+ payload{prompt: Prompt, allowedTokens: Allowed, modelSpec: ModelSpec}) :- !.
2479
2572
  process_engine_result(request_sample_token(Prompt, Allowed), request_sample_token, '',
2480
- payload{prompt: Prompt, allowedTokens: Allowed}) :- !.
2573
+ payload{prompt: Prompt, allowedTokens: Allowed, modelSpec: none}) :- !.
2574
+ process_engine_result(request_llm(Messages, ModelSpec), request_llm, '',
2575
+ payload{messages: Messages, modelSpec: ModelSpec}) :- !.
2481
2576
  process_engine_result(request_llm(Messages), request_llm, '',
2482
- payload{messages: Messages}) :- !.
2577
+ payload{messages: Messages, modelSpec: none}) :- !.
2483
2578
  process_engine_result(request_judgment(Payload), request_judgment, '', Payload) :- !.
2484
2579
  %% Tool result from inline tool execution
2485
2580
  process_engine_result(tool_result(Result), tool_result, '',
@@ -2714,6 +2809,25 @@ get_reasoning_effort(State, Effort) :-
2714
2809
  ; Effort = none
2715
2810
  ).
2716
2811
 
2812
+ %% set_model_state(+StateIn, +Spec, -StateOut)
2813
+ set_model_state(StateIn, Spec, StateOut) :-
2814
+ StateOut = StateIn.put(model_spec, Spec).
2815
+
2816
+ %% clear_model_state(+StateIn, -StateOut)
2817
+ clear_model_state(StateIn, StateOut) :-
2818
+ ( get_dict(model_spec, StateIn, _)
2819
+ -> del_dict(model_spec, StateIn, _, StateOut)
2820
+ ; StateOut = StateIn
2821
+ ).
2822
+
2823
+ %% get_model_spec(+State, -Spec)
2824
+ %% `none` means "no override" (use the session model).
2825
+ get_model_spec(State, Spec) :-
2826
+ ( get_dict(model_spec, State, Spec)
2827
+ -> true
2828
+ ; Spec = none
2829
+ ).
2830
+
2717
2831
  %% ============================================================
2718
2832
  %% Recipe Context Helpers
2719
2833
  %% ============================================================
@@ -3090,8 +3204,9 @@ mi_call(task(Desc), StateIn, StateOut) :-
3090
3204
  get_tool_scope(StateIn, ToolScope),
3091
3205
  get_reasoning_effort(StateIn, ReasoningEffort),
3092
3206
  get_recipe_context(StateIn, RecipeContext),
3207
+ get_model_spec(StateIn, ModelSpec),
3093
3208
  % Yield request with current memory and tool scope
3094
- engine_yield(request_agent_loop(InterpDesc, [], UserTools, Memory, ToolScope, ReasoningEffort, RecipeContext)),
3209
+ engine_yield(request_agent_loop(InterpDesc, [], UserTools, Memory, ToolScope, ReasoningEffort, RecipeContext, ModelSpec)),
3095
3210
  % Handle signals (tool calls) until agent_done
3096
3211
  handle_agent_signals(SessionId, StateIn, StateAfterAgent),
3097
3212
  session_agent_result(SessionId, Result),
@@ -3161,7 +3276,8 @@ mi_call(prompt(Desc), StateIn, StateOut) :-
3161
3276
  get_depth(StateIn, Depth),
3162
3277
  add_trace_entry(SessionId, llm_call, prompt, [InterpDesc], Depth),
3163
3278
  % prompt/N is a simple LLM call - no tools, no tool scope
3164
- engine_yield(request_agent_loop(InterpDesc, [], [], [], none)),
3279
+ get_model_spec(StateIn, ModelSpec),
3280
+ engine_yield(request_agent_loop(InterpDesc, [], [], [], none, ModelSpec)),
3165
3281
  % Wait for agent_done (no tool calls expected since no tools provided)
3166
3282
  handle_agent_signals(SessionId, StateIn, StateOut),
3167
3283
  session_agent_result(SessionId, Result),
@@ -3196,7 +3312,8 @@ mi_call_prompt_n(Desc, Vars, VarNames, StateIn, StateOut) :-
3196
3312
  get_depth(StateIn, Depth),
3197
3313
  add_trace_entry(SessionId, llm_call, prompt, [InterpDesc], Depth),
3198
3314
  % prompt/N is a simple LLM call - no tools, no tool scope
3199
- engine_yield(request_agent_loop(InterpDesc, VarNames, [], [], none)),
3315
+ get_model_spec(StateIn, ModelSpec),
3316
+ engine_yield(request_agent_loop(InterpDesc, VarNames, [], [], none, ModelSpec)),
3200
3317
  % Wait for agent_done (no tool calls expected since no tools provided)
3201
3318
  handle_agent_signals(SessionId, StateIn, StateOut),
3202
3319
  session_agent_result(SessionId, Result),
@@ -3223,7 +3340,8 @@ mi_call_sample_token(Desc, Allowed, Token, StateIn, StateOut) :-
3223
3340
  get_session_id(SessionId),
3224
3341
  get_depth(StateIn, Depth),
3225
3342
  add_trace_entry(SessionId, llm_call, sample_token, [InterpDesc, Allowed], Depth),
3226
- engine_yield(request_sample_token(InterpDesc, Allowed)),
3343
+ get_model_spec(StateIn, ModelSpec),
3344
+ engine_yield(request_sample_token(InterpDesc, Allowed, ModelSpec)),
3227
3345
  wait_sample_token_signal(SessionId),
3228
3346
  ( session_sample_token_result(SessionId, Result)
3229
3347
  -> retract(session_sample_token_result(SessionId, _)),
@@ -3431,7 +3549,8 @@ mi_call_llm(Messages, Reply, StateIn, StateOut) :-
3431
3549
  get_session_id(SessionId),
3432
3550
  get_depth(StateIn, Depth),
3433
3551
  add_trace_entry(SessionId, llm_call, llm, [Messages], Depth),
3434
- engine_yield(request_llm(Messages)),
3552
+ get_model_spec(StateIn, ModelSpec),
3553
+ engine_yield(request_llm(Messages, ModelSpec)),
3435
3554
  wait_llm_signal(SessionId),
3436
3555
  ( session_llm_result(SessionId, Result)
3437
3556
  -> retract(session_llm_result(SessionId, _)),
@@ -3474,7 +3593,8 @@ mi_call_task_n(Desc, Vars, VarNames, StateIn, StateOut) :-
3474
3593
  get_tool_scope(StateIn, ToolScope),
3475
3594
  get_reasoning_effort(StateIn, ReasoningEffort),
3476
3595
  get_recipe_context(StateIn, RecipeContext),
3477
- engine_yield(request_agent_loop(InterpDesc, VarNames, UserTools, Memory, ToolScope, ReasoningEffort, RecipeContext)),
3596
+ get_model_spec(StateIn, ModelSpec),
3597
+ engine_yield(request_agent_loop(InterpDesc, VarNames, UserTools, Memory, ToolScope, ReasoningEffort, RecipeContext, ModelSpec)),
3478
3598
  % Handle signals (tool calls) until agent_done
3479
3599
  handle_agent_signals(SessionId, StateIn, StateAfterAgent),
3480
3600
  session_agent_result(SessionId, Result),
@@ -3589,6 +3709,17 @@ mi_call(with_reasoning(Goal, Effort), StateIn, StateOut) :-
3589
3709
  mi_call(Goal, ScopedState, StateWithScope),
3590
3710
  clear_reasoning_effort_state(StateWithScope, StateOut).
3591
3711
 
3712
+ %% mi_call(with_model(Spec, Goal), +StateIn, -StateOut)
3713
+ %% Run Goal with a specific model, and optionally a reasoning level. `Spec` is a
3714
+ %% string — "provider:model", "provider:model#reasoning", "model",
3715
+ %% "model#reasoning" — or a model{provider, id, temperature, maxTokens, reasoning}
3716
+ %% dict. It applies to task/N, prompt/N and sample_token/N (not judgments).
3717
+ mi_call(with_model(Spec, Goal), StateIn, StateOut) :-
3718
+ !,
3719
+ set_model_state(StateIn, Spec, ScopedState),
3720
+ mi_call(Goal, ScopedState, StateWithScope),
3721
+ clear_model_state(StateWithScope, StateOut).
3722
+
3592
3723
  %% mi_call(with_recipe(Goal, Query), +StateIn, -StateOut)
3593
3724
  %% Run Goal with a recipe loaded as transient context (not persisted to memory).
3594
3725
  mi_call(with_recipe(Goal, Query), StateIn, StateOut) :-
@@ -3647,9 +3778,39 @@ mi_call(attach_media(Media), StateIn, StateOut) :-
3647
3778
  append(Memory, [Message], NewMemory),
3648
3779
  set_memory(StateIn, NewMemory, StateOut).
3649
3780
 
3781
+ %% mi_call(save_image(+Media, +OutPath), +StateIn, -StateOut)
3782
+ %% Write a media reference to a workspace file: `save_image(media(Path, Mime), "out.png")`,
3783
+ %% `save_image(media{svg: Svg}, "out.svg")`. Parent directories must exist.
3784
+ mi_call(save_image(Media, Out), StateIn, StateIn) :-
3785
+ !,
3786
+ media_dict(Media, Dict),
3787
+ ( get_dict(kind, Dict, inline_svg),
3788
+ get_dict(data, Dict, Svg)
3789
+ -> resolve_workspace_path(Out, OutAbs),
3790
+ open(OutAbs, write, Stream),
3791
+ write(Stream, Svg),
3792
+ close(Stream)
3793
+ ; get_dict(path, Dict, Path),
3794
+ Path \== ""
3795
+ -> resolve_workspace_path(Path, InAbs),
3796
+ resolve_workspace_path(Out, OutAbs),
3797
+ copy_file(InAbs, OutAbs)
3798
+ ; throw(error(domain_error(save_image, Media), save_image/2))
3799
+ ).
3800
+
3650
3801
  %% media_dict(+Media, -Dict)
3651
- %% Accepts media(Path, Mime) or a bare path; normalizes to the storage dict.
3802
+ %% Normalizes an image reference for display/attachment:
3803
+ %% media(Path, Mime) | media(Path) | a bare Path string
3804
+ %% media{path: Path} | media{path: Path, mime: Mime}
3805
+ %% media{svg: SvgString} (inline SVG)
3806
+ %% media{data: Base64} | media{data: Base64, mime: Mime} (inline bytes)
3652
3807
  media_dict(media(Path, Mime), media{path: Path, mime: Mime}) :- !.
3808
+ media_dict(media(Path), media{path: Path, mime: Mime}) :- !, media_mime(Path, Mime).
3809
+ media_dict(media{path: Path, mime: Mime}, media{path: Path, mime: Mime}) :- !.
3810
+ media_dict(media{path: Path}, media{path: Path, mime: Mime}) :- !, media_mime(Path, Mime).
3811
+ media_dict(media{svg: Svg}, media{path: "", mime: "image/svg+xml", kind: inline_svg, data: Svg}) :- !.
3812
+ media_dict(media{data: Data, mime: Mime}, media{path: "", mime: Mime, kind: inline_data, data: Data}) :- !.
3813
+ media_dict(media{data: Data}, media{path: "", mime: "image/png", kind: inline_data, data: Data}) :- !.
3653
3814
  media_dict(Path, media{path: Path, mime: Mime}) :- media_mime(Path, Mime).
3654
3815
 
3655
3816
  %% media_mime(+Path, -Mime)
@@ -3657,6 +3818,7 @@ media_dict(Path, media{path: Path, mime: Mime}) :- media_mime(Path, Mime).
3657
3818
  media_mime(Path, Mime) :-
3658
3819
  ( string(Path) -> atom_string(Atom, Path) ; Atom = Path ),
3659
3820
  ( sub_atom(Atom, _, _, 0, '.png') -> Mime = "image/png"
3821
+ ; sub_atom(Atom, _, _, 0, '.svg') -> Mime = "image/svg+xml"
3660
3822
  ; sub_atom(Atom, _, _, 0, '.jpg') -> Mime = "image/jpeg"
3661
3823
  ; sub_atom(Atom, _, _, 0, '.jpeg') -> Mime = "image/jpeg"
3662
3824
  ; sub_atom(Atom, _, _, 0, '.gif') -> Mime = "image/gif"
@@ -3676,6 +3838,29 @@ mi_call(answer(Text), StateIn, StateIn) :-
3676
3838
  engine_yield(answer(InterpText)),
3677
3839
  throw('$answer_commit').
3678
3840
 
3841
+ %% mi_call(output(Media), +StateIn, -StateOut)
3842
+ %% Present an image instead of text: `output(media(Path, Mime))`, `output(media(Path))`,
3843
+ %% or a dict form (`media{svg: Svg}`, `media{data: Base64, mime: Mime}`). The host
3844
+ %% renders it inline (kitty/iTerm2) or reports the path.
3845
+ %% This clause must come before the generic `output(Text)` clause; it fails
3846
+ %% through for anything that is not a media reference.
3847
+ mi_call(output(Media), StateIn, StateIn) :-
3848
+ nonvar(Media),
3849
+ ( Media = media(_, _)
3850
+ ; Media = media(_)
3851
+ ; is_dict(Media)
3852
+ ),
3853
+ media_dict(Media, Dict),
3854
+ !,
3855
+ get_dict(mime, Dict, Mime),
3856
+ get_dict(path, Dict, Path),
3857
+ ( get_dict(data, Dict, Data) -> true ; Data = "" ),
3858
+ ( get_dict(kind, Dict, Kind) -> true ; Kind = file ),
3859
+ get_session_id(SessionId),
3860
+ get_depth(StateIn, Depth),
3861
+ add_trace_entry(SessionId, media, media, [Path], Depth),
3862
+ engine_yield(media(media{path: Path, mimeType: Mime, kind: Kind, data: Data})).
3863
+
3679
3864
  %% mi_call(output(Text), +StateIn, -StateOut)
3680
3865
  mi_call(output(Text), StateIn, StateIn) :-
3681
3866
  get_params(StateIn, Params),
@@ -4419,6 +4604,7 @@ is_mi_special_predicate(system(_)).
4419
4604
  is_mi_special_predicate(user(_)). %% Add user message to context
4420
4605
  is_mi_special_predicate(read_media(_,_)).
4421
4606
  is_mi_special_predicate(attach_media(_)).
4607
+ is_mi_special_predicate(save_image(_,_)).
4422
4608
  is_mi_special_predicate(task(_)).
4423
4609
  is_mi_special_predicate(task(_,_)).
4424
4610
  is_mi_special_predicate(task(_,_,_)).
@@ -4442,6 +4628,7 @@ is_mi_special_predicate(with_tools(_,_)).
4442
4628
  is_mi_special_predicate(without_tools(_,_)).
4443
4629
  %% Reasoning effort scoping
4444
4630
  is_mi_special_predicate(with_reasoning(_,_)).
4631
+ is_mi_special_predicate(with_model(_,_)).
4445
4632
  %% Recipe context scoping
4446
4633
  is_mi_special_predicate(with_recipe(_,_)).
4447
4634
  %% Semantic judgment predicates