deepclause-sdk 0.0.58 → 0.0.59

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.
@@ -2199,14 +2199,15 @@ flatten_conjunction((A1, A2), B, Result) :- !,
2199
2199
  flatten_conjunction(A, B, (A, B)).
2200
2200
 
2201
2201
  %% string_needs_interpolation(+String)
2202
- %% Check if a string contains {VarName} patterns
2202
+ %% Check if a string contains identifier-like {VarName} patterns
2203
2203
  string_needs_interpolation(String) :-
2204
2204
  ( string(String) -> S = String
2205
2205
  ; atom(String) -> atom_string(String, S)
2206
2206
  ; fail
2207
2207
  ),
2208
- sub_string(S, _, _, _, "{"),
2209
- sub_string(S, _, _, _, "}").
2208
+ string_codes(S, Codes),
2209
+ extract_vars_from_codes(Codes, VarNames, _),
2210
+ VarNames \= [].
2210
2211
 
2211
2212
  %% build_format_call(+Template, +Bindings, -TempVar, -FormatGoal)
2212
2213
  %% Build a format/3 call that produces the interpolated string
@@ -2247,11 +2248,17 @@ extract_interpolation_vars(Template, VarNames, FormatString) :-
2247
2248
  extract_vars_from_codes([], [], []) :- !.
2248
2249
 
2249
2250
  % Found opening brace
2250
- extract_vars_from_codes([0'{|Rest], [VarName|VarNames], [0'~, 0'w|FormatRest]) :- !,
2251
+ extract_vars_from_codes([0'{|Rest], [VarName|VarNames], [0'~, 0'w|FormatRest]) :-
2251
2252
  extract_var_until_close(Rest, VarNameCodes, AfterClose),
2253
+ valid_placeholder_codes(VarNameCodes),
2254
+ !,
2252
2255
  atom_codes(VarName, VarNameCodes),
2253
2256
  extract_vars_from_codes(AfterClose, VarNames, FormatRest).
2254
2257
 
2258
+ % Invalid placeholder syntax - keep the opening brace literal
2259
+ extract_vars_from_codes([0'{|Rest], VarNames, [0'{|FormatRest]) :- !,
2260
+ extract_vars_from_codes(Rest, VarNames, FormatRest).
2261
+
2255
2262
  % Escape tilde for format/3
2256
2263
  extract_vars_from_codes([0'~|Rest], VarNames, [0'~, 0'~|FormatRest]) :- !,
2257
2264
  extract_vars_from_codes(Rest, VarNames, FormatRest).
@@ -2266,6 +2273,20 @@ extract_var_until_close([C|Rest], [C|VarRest], Final) :-
2266
2273
  extract_var_until_close(Rest, VarRest, Final).
2267
2274
  extract_var_until_close([], [], []).
2268
2275
 
2276
+ %% valid_placeholder_codes(+Codes)
2277
+ %% Placeholder names must look like identifiers: [A-Za-z_][A-Za-z0-9_]*
2278
+ valid_placeholder_codes([First|Rest]) :-
2279
+ valid_placeholder_start(First),
2280
+ maplist(valid_placeholder_char, Rest).
2281
+
2282
+ valid_placeholder_start(Code) :-
2283
+ code_type(Code, alpha)
2284
+ ; Code =:= 0'_.
2285
+
2286
+ valid_placeholder_char(Code) :-
2287
+ code_type(Code, alnum)
2288
+ ; Code =:= 0'_.
2289
+
2269
2290
  %% lookup_vars_with_params(+VarNames, +Bindings, -VarList, -ParamGoals)
2270
2291
  %% Look up each variable name:
2271
2292
  %% - If in Bindings (local Prolog variable) → use directly
@@ -36,10 +36,11 @@ interpolate_atom(Template, Bindings, Result) :-
36
36
  %% Process character codes, replacing {var} patterns
37
37
  interpolate_codes([], _, []) :- !.
38
38
 
39
- % Found opening brace - extract variable name
39
+ % Found opening brace - replace only identifier-like placeholders
40
40
  interpolate_codes([0'{|Rest], Bindings, Result) :-
41
- !,
42
41
  extract_var_name(Rest, VarNameCodes, AfterVar),
42
+ valid_placeholder_codes(VarNameCodes),
43
+ !,
43
44
  atom_codes(VarName, VarNameCodes),
44
45
  ( find_binding(VarName, Bindings, Value)
45
46
  -> format(atom(ValueAtom), '~w', [Value]),
@@ -51,6 +52,11 @@ interpolate_codes([0'{|Rest], Bindings, Result) :-
51
52
  append([0'{|VarNameCodes], [0'}|RestResult], Result)
52
53
  ).
53
54
 
55
+ % Invalid placeholder syntax - keep the opening brace literal
56
+ interpolate_codes([0'{|Rest], Bindings, [0'{|Result]) :-
57
+ !,
58
+ interpolate_codes(Rest, Bindings, Result).
59
+
54
60
  % Regular character - keep it
55
61
  interpolate_codes([C|Rest], Bindings, [C|Result]) :-
56
62
  interpolate_codes(Rest, Bindings, Result).
@@ -63,6 +69,20 @@ extract_var_name([C|Rest], [C|VarRest], Final) :-
63
69
  extract_var_name(Rest, VarRest, Final).
64
70
  extract_var_name([], [], []). % Handle unclosed brace gracefully
65
71
 
72
+ %% valid_placeholder_codes(+Codes)
73
+ %% Placeholder names must look like identifiers: [A-Za-z_][A-Za-z0-9_]*
74
+ valid_placeholder_codes([First|Rest]) :-
75
+ valid_placeholder_start(First),
76
+ maplist(valid_placeholder_char, Rest).
77
+
78
+ valid_placeholder_start(Code) :-
79
+ code_type(Code, alpha)
80
+ ; Code =:= 0'_.
81
+
82
+ valid_placeholder_char(Code) :-
83
+ code_type(Code, alnum)
84
+ ; Code =:= 0'_.
85
+
66
86
  %% find_binding(+VarName, +Bindings, -Value)
67
87
  %% Look up a variable in the bindings list
68
88
  find_binding(VarName, Bindings, Value) :-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepclause-sdk",
3
- "version": "0.0.58",
3
+ "version": "0.0.59",
4
4
  "description": "DeepClause CLI Tool and Typescript SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -2199,14 +2199,15 @@ flatten_conjunction((A1, A2), B, Result) :- !,
2199
2199
  flatten_conjunction(A, B, (A, B)).
2200
2200
 
2201
2201
  %% string_needs_interpolation(+String)
2202
- %% Check if a string contains {VarName} patterns
2202
+ %% Check if a string contains identifier-like {VarName} patterns
2203
2203
  string_needs_interpolation(String) :-
2204
2204
  ( string(String) -> S = String
2205
2205
  ; atom(String) -> atom_string(String, S)
2206
2206
  ; fail
2207
2207
  ),
2208
- sub_string(S, _, _, _, "{"),
2209
- sub_string(S, _, _, _, "}").
2208
+ string_codes(S, Codes),
2209
+ extract_vars_from_codes(Codes, VarNames, _),
2210
+ VarNames \= [].
2210
2211
 
2211
2212
  %% build_format_call(+Template, +Bindings, -TempVar, -FormatGoal)
2212
2213
  %% Build a format/3 call that produces the interpolated string
@@ -2247,11 +2248,17 @@ extract_interpolation_vars(Template, VarNames, FormatString) :-
2247
2248
  extract_vars_from_codes([], [], []) :- !.
2248
2249
 
2249
2250
  % Found opening brace
2250
- extract_vars_from_codes([0'{|Rest], [VarName|VarNames], [0'~, 0'w|FormatRest]) :- !,
2251
+ extract_vars_from_codes([0'{|Rest], [VarName|VarNames], [0'~, 0'w|FormatRest]) :-
2251
2252
  extract_var_until_close(Rest, VarNameCodes, AfterClose),
2253
+ valid_placeholder_codes(VarNameCodes),
2254
+ !,
2252
2255
  atom_codes(VarName, VarNameCodes),
2253
2256
  extract_vars_from_codes(AfterClose, VarNames, FormatRest).
2254
2257
 
2258
+ % Invalid placeholder syntax - keep the opening brace literal
2259
+ extract_vars_from_codes([0'{|Rest], VarNames, [0'{|FormatRest]) :- !,
2260
+ extract_vars_from_codes(Rest, VarNames, FormatRest).
2261
+
2255
2262
  % Escape tilde for format/3
2256
2263
  extract_vars_from_codes([0'~|Rest], VarNames, [0'~, 0'~|FormatRest]) :- !,
2257
2264
  extract_vars_from_codes(Rest, VarNames, FormatRest).
@@ -2266,6 +2273,20 @@ extract_var_until_close([C|Rest], [C|VarRest], Final) :-
2266
2273
  extract_var_until_close(Rest, VarRest, Final).
2267
2274
  extract_var_until_close([], [], []).
2268
2275
 
2276
+ %% valid_placeholder_codes(+Codes)
2277
+ %% Placeholder names must look like identifiers: [A-Za-z_][A-Za-z0-9_]*
2278
+ valid_placeholder_codes([First|Rest]) :-
2279
+ valid_placeholder_start(First),
2280
+ maplist(valid_placeholder_char, Rest).
2281
+
2282
+ valid_placeholder_start(Code) :-
2283
+ code_type(Code, alpha)
2284
+ ; Code =:= 0'_.
2285
+
2286
+ valid_placeholder_char(Code) :-
2287
+ code_type(Code, alnum)
2288
+ ; Code =:= 0'_.
2289
+
2269
2290
  %% lookup_vars_with_params(+VarNames, +Bindings, -VarList, -ParamGoals)
2270
2291
  %% Look up each variable name:
2271
2292
  %% - If in Bindings (local Prolog variable) → use directly
@@ -36,10 +36,11 @@ interpolate_atom(Template, Bindings, Result) :-
36
36
  %% Process character codes, replacing {var} patterns
37
37
  interpolate_codes([], _, []) :- !.
38
38
 
39
- % Found opening brace - extract variable name
39
+ % Found opening brace - replace only identifier-like placeholders
40
40
  interpolate_codes([0'{|Rest], Bindings, Result) :-
41
- !,
42
41
  extract_var_name(Rest, VarNameCodes, AfterVar),
42
+ valid_placeholder_codes(VarNameCodes),
43
+ !,
43
44
  atom_codes(VarName, VarNameCodes),
44
45
  ( find_binding(VarName, Bindings, Value)
45
46
  -> format(atom(ValueAtom), '~w', [Value]),
@@ -51,6 +52,11 @@ interpolate_codes([0'{|Rest], Bindings, Result) :-
51
52
  append([0'{|VarNameCodes], [0'}|RestResult], Result)
52
53
  ).
53
54
 
55
+ % Invalid placeholder syntax - keep the opening brace literal
56
+ interpolate_codes([0'{|Rest], Bindings, [0'{|Result]) :-
57
+ !,
58
+ interpolate_codes(Rest, Bindings, Result).
59
+
54
60
  % Regular character - keep it
55
61
  interpolate_codes([C|Rest], Bindings, [C|Result]) :-
56
62
  interpolate_codes(Rest, Bindings, Result).
@@ -63,6 +69,20 @@ extract_var_name([C|Rest], [C|VarRest], Final) :-
63
69
  extract_var_name(Rest, VarRest, Final).
64
70
  extract_var_name([], [], []). % Handle unclosed brace gracefully
65
71
 
72
+ %% valid_placeholder_codes(+Codes)
73
+ %% Placeholder names must look like identifiers: [A-Za-z_][A-Za-z0-9_]*
74
+ valid_placeholder_codes([First|Rest]) :-
75
+ valid_placeholder_start(First),
76
+ maplist(valid_placeholder_char, Rest).
77
+
78
+ valid_placeholder_start(Code) :-
79
+ code_type(Code, alpha)
80
+ ; Code =:= 0'_.
81
+
82
+ valid_placeholder_char(Code) :-
83
+ code_type(Code, alnum)
84
+ ; Code =:= 0'_.
85
+
66
86
  %% find_binding(+VarName, +Bindings, -Value)
67
87
  %% Look up a variable in the bindings list
68
88
  find_binding(VarName, Bindings, Value) :-