deepclause-sdk 0.0.88 → 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 (318) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +418 -914
  3. package/dist/agent.d.ts +19 -2
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +221 -4
  6. package/dist/agent.js.map +1 -1
  7. package/dist/cli/config.d.ts +323 -176
  8. package/dist/cli/config.d.ts.map +1 -1
  9. package/dist/cli/config.js +146 -188
  10. package/dist/cli/config.js.map +1 -1
  11. package/dist/cli/index.d.ts +3 -2
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +61 -425
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/login.d.ts +29 -0
  16. package/dist/cli/login.d.ts.map +1 -0
  17. package/dist/cli/login.js +184 -0
  18. package/dist/cli/login.js.map +1 -0
  19. package/dist/cli/readline.d.ts +6 -0
  20. package/dist/cli/readline.d.ts.map +1 -0
  21. package/dist/cli/readline.js +15 -0
  22. package/dist/cli/readline.js.map +1 -0
  23. package/dist/cli/repl-bin.d.ts +9 -0
  24. package/dist/cli/repl-bin.d.ts.map +1 -0
  25. package/dist/cli/repl-bin.js +16 -0
  26. package/dist/cli/repl-bin.js.map +1 -0
  27. package/dist/cli/repl.d.ts +191 -0
  28. package/dist/cli/repl.d.ts.map +1 -0
  29. package/dist/cli/repl.js +1232 -0
  30. package/dist/cli/repl.js.map +1 -0
  31. package/dist/cli/run.d.ts +17 -18
  32. package/dist/cli/run.d.ts.map +1 -1
  33. package/dist/cli/run.js +196 -183
  34. package/dist/cli/run.js.map +1 -1
  35. package/dist/cli/set-backend.d.ts +53 -0
  36. package/dist/cli/set-backend.d.ts.map +1 -0
  37. package/dist/cli/set-backend.js +259 -0
  38. package/dist/cli/set-backend.js.map +1 -0
  39. package/dist/cli/visualize.d.ts +38 -0
  40. package/dist/cli/visualize.d.ts.map +1 -0
  41. package/dist/cli/visualize.js +125 -0
  42. package/dist/cli/visualize.js.map +1 -0
  43. package/dist/compiler.d.ts +5 -52
  44. package/dist/compiler.d.ts.map +1 -1
  45. package/dist/compiler.js +4 -768
  46. package/dist/compiler.js.map +1 -1
  47. package/dist/index.d.ts +29 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +20 -2
  50. package/dist/index.js.map +1 -1
  51. package/dist/judge/index.d.ts +9 -0
  52. package/dist/judge/index.d.ts.map +1 -0
  53. package/dist/judge/index.js +6 -0
  54. package/dist/judge/index.js.map +1 -0
  55. package/dist/judge/jev.d.ts +21 -0
  56. package/dist/judge/jev.d.ts.map +1 -0
  57. package/dist/judge/jev.js +218 -0
  58. package/dist/judge/jev.js.map +1 -0
  59. package/dist/judge/llm.d.ts +23 -0
  60. package/dist/judge/llm.d.ts.map +1 -0
  61. package/dist/judge/llm.js +120 -0
  62. package/dist/judge/llm.js.map +1 -0
  63. package/dist/judge/marshal.d.ts +26 -0
  64. package/dist/judge/marshal.d.ts.map +1 -0
  65. package/dist/judge/marshal.js +266 -0
  66. package/dist/judge/marshal.js.map +1 -0
  67. package/dist/judge/mock.d.ts +28 -0
  68. package/dist/judge/mock.d.ts.map +1 -0
  69. package/dist/judge/mock.js +98 -0
  70. package/dist/judge/mock.js.map +1 -0
  71. package/dist/judge/types.d.ts +95 -0
  72. package/dist/judge/types.d.ts.map +1 -0
  73. package/dist/judge/types.js +23 -0
  74. package/dist/judge/types.js.map +1 -0
  75. package/dist/prolog/bridge.d.ts +5 -1
  76. package/dist/prolog/bridge.d.ts.map +1 -1
  77. package/dist/prolog/bridge.js +29 -1
  78. package/dist/prolog/bridge.js.map +1 -1
  79. package/dist/prolog-src/deepclause_analysis.pl +10 -2
  80. package/dist/prolog-src/deepclause_mi.pl +2522 -118
  81. package/dist/repl/agent.d.ts +72 -0
  82. package/dist/repl/agent.d.ts.map +1 -0
  83. package/dist/repl/agent.js +366 -0
  84. package/dist/repl/agent.js.map +1 -0
  85. package/dist/repl/auth.d.ts +45 -0
  86. package/dist/repl/auth.d.ts.map +1 -0
  87. package/dist/repl/auth.js +116 -0
  88. package/dist/repl/auth.js.map +1 -0
  89. package/dist/repl/backend.d.ts +290 -0
  90. package/dist/repl/backend.d.ts.map +1 -0
  91. package/dist/repl/backend.js +370 -0
  92. package/dist/repl/backend.js.map +1 -0
  93. package/dist/repl/compaction.d.ts +122 -0
  94. package/dist/repl/compaction.d.ts.map +1 -0
  95. package/dist/repl/compaction.js +318 -0
  96. package/dist/repl/compaction.js.map +1 -0
  97. package/dist/repl/export.d.ts +30 -0
  98. package/dist/repl/export.d.ts.map +1 -0
  99. package/dist/repl/export.js +23 -0
  100. package/dist/repl/export.js.map +1 -0
  101. package/dist/repl/frames.d.ts +21 -0
  102. package/dist/repl/frames.d.ts.map +1 -0
  103. package/dist/repl/frames.js +79 -0
  104. package/dist/repl/frames.js.map +1 -0
  105. package/dist/repl/harness-tools.d.ts +74 -0
  106. package/dist/repl/harness-tools.d.ts.map +1 -0
  107. package/dist/repl/harness-tools.js +121 -0
  108. package/dist/repl/harness-tools.js.map +1 -0
  109. package/dist/repl/highlight.d.ts +30 -0
  110. package/dist/repl/highlight.d.ts.map +1 -0
  111. package/dist/repl/highlight.js +285 -0
  112. package/dist/repl/highlight.js.map +1 -0
  113. package/dist/repl/history.d.ts +234 -0
  114. package/dist/repl/history.d.ts.map +1 -0
  115. package/dist/repl/history.js +661 -0
  116. package/dist/repl/history.js.map +1 -0
  117. package/dist/repl/index.d.ts +120 -0
  118. package/dist/repl/index.d.ts.map +1 -0
  119. package/dist/repl/index.js +107 -0
  120. package/dist/repl/index.js.map +1 -0
  121. package/dist/repl/judge.d.ts +51 -0
  122. package/dist/repl/judge.d.ts.map +1 -0
  123. package/dist/repl/judge.js +58 -0
  124. package/dist/repl/judge.js.map +1 -0
  125. package/dist/repl/markdown.d.ts +25 -0
  126. package/dist/repl/markdown.d.ts.map +1 -0
  127. package/dist/repl/markdown.js +103 -0
  128. package/dist/repl/markdown.js.map +1 -0
  129. package/dist/repl/picker.d.ts +34 -0
  130. package/dist/repl/picker.d.ts.map +1 -0
  131. package/dist/repl/picker.js +81 -0
  132. package/dist/repl/picker.js.map +1 -0
  133. package/dist/repl/project-context.d.ts +16 -0
  134. package/dist/repl/project-context.d.ts.map +1 -0
  135. package/dist/repl/project-context.js +23 -0
  136. package/dist/repl/project-context.js.map +1 -0
  137. package/dist/repl/render.d.ts +160 -0
  138. package/dist/repl/render.d.ts.map +1 -0
  139. package/dist/repl/render.js +715 -0
  140. package/dist/repl/render.js.map +1 -0
  141. package/dist/repl/session.d.ts +356 -0
  142. package/dist/repl/session.d.ts.map +1 -0
  143. package/dist/repl/session.js +1275 -0
  144. package/dist/repl/session.js.map +1 -0
  145. package/dist/repl/status.d.ts +100 -0
  146. package/dist/repl/status.d.ts.map +1 -0
  147. package/dist/repl/status.js +218 -0
  148. package/dist/repl/status.js.map +1 -0
  149. package/dist/repl/tools.d.ts +53 -0
  150. package/dist/repl/tools.d.ts.map +1 -0
  151. package/dist/repl/tools.js +307 -0
  152. package/dist/repl/tools.js.map +1 -0
  153. package/dist/repl/toolset.d.ts +32 -0
  154. package/dist/repl/toolset.d.ts.map +1 -0
  155. package/dist/repl/toolset.js +82 -0
  156. package/dist/repl/toolset.js.map +1 -0
  157. package/dist/repl/tui/editor.d.ts +17 -0
  158. package/dist/repl/tui/editor.d.ts.map +1 -0
  159. package/dist/repl/tui/editor.js +39 -0
  160. package/dist/repl/tui/editor.js.map +1 -0
  161. package/dist/repl/tui/status-bar.d.ts +26 -0
  162. package/dist/repl/tui/status-bar.d.ts.map +1 -0
  163. package/dist/repl/tui/status-bar.js +47 -0
  164. package/dist/repl/tui/status-bar.js.map +1 -0
  165. package/dist/repl/tui/theme.d.ts +30 -0
  166. package/dist/repl/tui/theme.d.ts.map +1 -0
  167. package/dist/repl/tui/theme.js +81 -0
  168. package/dist/repl/tui/theme.js.map +1 -0
  169. package/dist/repl/tui/transcript.d.ts +39 -0
  170. package/dist/repl/tui/transcript.d.ts.map +1 -0
  171. package/dist/repl/tui/transcript.js +123 -0
  172. package/dist/repl/tui/transcript.js.map +1 -0
  173. package/dist/runner.d.ts +145 -13
  174. package/dist/runner.d.ts.map +1 -1
  175. package/dist/runner.js +600 -282
  176. package/dist/runner.js.map +1 -1
  177. package/dist/sdk.d.ts.map +1 -1
  178. package/dist/sdk.js +56 -32
  179. package/dist/sdk.js.map +1 -1
  180. package/dist/system/assets/docs/AGENT_PROMPT.md +1373 -0
  181. package/dist/system/assets/docs/DML_AUTHORING.md +195 -0
  182. package/dist/system/assets/docs/DML_REFERENCE.md +393 -72
  183. package/dist/system/assets/docs/HARNESS_EXAMPLES.md +172 -0
  184. package/dist/system/assets/docs/HARNESS_PATTERNS.md +562 -0
  185. package/dist/system/assets/docs/META_PROMPT.md +68 -0
  186. package/dist/system/assets/docs/PROLOG_SNIPPETS.md +117 -0
  187. package/dist/system/assets/index.d.ts +9 -17
  188. package/dist/system/assets/index.d.ts.map +1 -1
  189. package/dist/system/assets/index.js +26 -85
  190. package/dist/system/assets/index.js.map +1 -1
  191. package/dist/system/runtime/agentvm-manager.d.ts +9 -2
  192. package/dist/system/runtime/agentvm-manager.d.ts.map +1 -1
  193. package/dist/system/runtime/agentvm-manager.js +70 -44
  194. package/dist/system/runtime/agentvm-manager.js.map +1 -1
  195. package/dist/system/runtime/media.d.ts +23 -0
  196. package/dist/system/runtime/media.d.ts.map +1 -0
  197. package/dist/system/runtime/media.js +55 -0
  198. package/dist/system/runtime/media.js.map +1 -0
  199. package/dist/system/runtime/shell-limits.d.ts +21 -0
  200. package/dist/system/runtime/shell-limits.d.ts.map +1 -0
  201. package/dist/system/runtime/shell-limits.js +39 -0
  202. package/dist/system/runtime/shell-limits.js.map +1 -0
  203. package/dist/system/runtime/shell-manager.d.ts +8 -3
  204. package/dist/system/runtime/shell-manager.d.ts.map +1 -1
  205. package/dist/system/runtime/shell-manager.js +56 -39
  206. package/dist/system/runtime/shell-manager.js.map +1 -1
  207. package/dist/system/runtime/shell-tool-events.js +5 -0
  208. package/dist/system/runtime/shell-tool-events.js.map +1 -1
  209. package/dist/system/runtime/token-usage.d.ts +2 -0
  210. package/dist/system/runtime/token-usage.d.ts.map +1 -1
  211. package/dist/system/runtime/token-usage.js +7 -0
  212. package/dist/system/runtime/token-usage.js.map +1 -1
  213. package/dist/tools.d.ts +3 -21
  214. package/dist/tools.d.ts.map +1 -1
  215. package/dist/tools.js +14 -168
  216. package/dist/tools.js.map +1 -1
  217. package/dist/types.d.ts +149 -118
  218. package/dist/types.d.ts.map +1 -1
  219. package/dist/validate.d.ts +19 -0
  220. package/dist/validate.d.ts.map +1 -0
  221. package/dist/validate.js +338 -0
  222. package/dist/validate.js.map +1 -0
  223. package/dist/visualize/index.d.ts +52 -0
  224. package/dist/visualize/index.d.ts.map +1 -0
  225. package/dist/visualize/index.js +189 -0
  226. package/dist/visualize/index.js.map +1 -0
  227. package/package.json +17 -15
  228. package/src/prolog-src/deepclause_analysis.pl +10 -2
  229. package/src/prolog-src/deepclause_mi.pl +2522 -118
  230. package/dist/cli/commands.d.ts +0 -42
  231. package/dist/cli/commands.d.ts.map +0 -1
  232. package/dist/cli/commands.js +0 -246
  233. package/dist/cli/commands.js.map +0 -1
  234. package/dist/cli/compile.d.ts +0 -99
  235. package/dist/cli/compile.d.ts.map +0 -1
  236. package/dist/cli/compile.js +0 -363
  237. package/dist/cli/compile.js.map +0 -1
  238. package/dist/cli/default-skills.d.ts +0 -10
  239. package/dist/cli/default-skills.d.ts.map +0 -1
  240. package/dist/cli/default-skills.js +0 -206
  241. package/dist/cli/default-skills.js.map +0 -1
  242. package/dist/cli/interactive.d.ts +0 -2
  243. package/dist/cli/interactive.d.ts.map +0 -1
  244. package/dist/cli/interactive.js +0 -20
  245. package/dist/cli/interactive.js.map +0 -1
  246. package/dist/cli/mcp.d.ts +0 -56
  247. package/dist/cli/mcp.d.ts.map +0 -1
  248. package/dist/cli/mcp.js +0 -138
  249. package/dist/cli/mcp.js.map +0 -1
  250. package/dist/cli/prompt.d.ts +0 -2
  251. package/dist/cli/prompt.d.ts.map +0 -1
  252. package/dist/cli/prompt.js +0 -2
  253. package/dist/cli/prompt.js.map +0 -1
  254. package/dist/cli/search.d.ts +0 -19
  255. package/dist/cli/search.d.ts.map +0 -1
  256. package/dist/cli/search.js +0 -189
  257. package/dist/cli/search.js.map +0 -1
  258. package/dist/cli/tool-args.d.ts +0 -2
  259. package/dist/cli/tool-args.d.ts.map +0 -1
  260. package/dist/cli/tool-args.js +0 -39
  261. package/dist/cli/tool-args.js.map +0 -1
  262. package/dist/cli/tools.d.ts +0 -36
  263. package/dist/cli/tools.d.ts.map +0 -1
  264. package/dist/cli/tools.js +0 -229
  265. package/dist/cli/tools.js.map +0 -1
  266. package/dist/cli/tui/index.d.ts +0 -22
  267. package/dist/cli/tui/index.d.ts.map +0 -1
  268. package/dist/cli/tui/index.js +0 -29
  269. package/dist/cli/tui/index.js.map +0 -1
  270. package/dist/cli/tui.d.ts +0 -167
  271. package/dist/cli/tui.d.ts.map +0 -1
  272. package/dist/cli/tui.js +0 -5228
  273. package/dist/cli/tui.js.map +0 -1
  274. package/dist/compiler_prompt.d.ts +0 -20
  275. package/dist/compiler_prompt.d.ts.map +0 -1
  276. package/dist/compiler_prompt.js +0 -870
  277. package/dist/compiler_prompt.js.map +0 -1
  278. package/dist/deepclause-cli.skill +0 -0
  279. package/dist/prolog-src/deepclause_mi.pl.bak +0 -570
  280. package/dist/system/assets/compactors/default-memory-compactor.dml +0 -6
  281. package/dist/system/assets/docs/CONDUCTOR_PROMPT.md +0 -105
  282. package/dist/system/assets/docs/DML_COMPILER_PROMPT.md +0 -700
  283. package/dist/system/assets/docs/TUI.md +0 -150
  284. package/dist/system/assets/recipes/deepclause-coding-workflow/SKILL.md +0 -100
  285. package/dist/system/assets/skills/conductor.dml +0 -76
  286. package/dist/system/assets/skills/deep-planner.dml +0 -412
  287. package/dist/system/assets/skills/plan.dml +0 -429
  288. package/dist/system/assets/skills/security-planner.dml +0 -337
  289. package/dist/system/assets/skills/skill-creator.dml +0 -187
  290. package/dist/system/runtime/catalog-recipes.d.ts +0 -24
  291. package/dist/system/runtime/catalog-recipes.d.ts.map +0 -1
  292. package/dist/system/runtime/catalog-recipes.js +0 -273
  293. package/dist/system/runtime/catalog-recipes.js.map +0 -1
  294. package/dist/system/runtime/catalog-skills.d.ts +0 -50
  295. package/dist/system/runtime/catalog-skills.d.ts.map +0 -1
  296. package/dist/system/runtime/catalog-skills.js +0 -152
  297. package/dist/system/runtime/catalog-skills.js.map +0 -1
  298. package/dist/system/runtime/conductor.d.ts +0 -105
  299. package/dist/system/runtime/conductor.d.ts.map +0 -1
  300. package/dist/system/runtime/conductor.js +0 -732
  301. package/dist/system/runtime/conductor.js.map +0 -1
  302. package/dist/system/runtime/console-capture.d.ts +0 -9
  303. package/dist/system/runtime/console-capture.d.ts.map +0 -1
  304. package/dist/system/runtime/console-capture.js +0 -67
  305. package/dist/system/runtime/console-capture.js.map +0 -1
  306. package/dist/system/runtime/dml-executor.d.ts +0 -52
  307. package/dist/system/runtime/dml-executor.d.ts.map +0 -1
  308. package/dist/system/runtime/dml-executor.js +0 -203
  309. package/dist/system/runtime/dml-executor.js.map +0 -1
  310. package/dist/system/runtime/runtime-tools.d.ts +0 -31
  311. package/dist/system/runtime/runtime-tools.d.ts.map +0 -1
  312. package/dist/system/runtime/runtime-tools.js +0 -312
  313. package/dist/system/runtime/runtime-tools.js.map +0 -1
  314. package/dist/system/runtime/skill-creator.d.ts +0 -38
  315. package/dist/system/runtime/skill-creator.d.ts.map +0 -1
  316. package/dist/system/runtime/skill-creator.js +0 -763
  317. package/dist/system/runtime/skill-creator.js.map +0 -1
  318. package/src/prolog-src/deepclause_mi.pl.bak +0 -570
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Backend resolution for the REPL (M5).
3
+ *
4
+ * `env` uses the SDK's provider/API-key backend (unchanged). `pi` reuses pi's
5
+ * own model registry and credential store so the REPL runs against the model
6
+ * configured in pi, without asking for API keys or writing provider env vars.
7
+ *
8
+ * The pi packages are optional peers and loaded with a dynamic import only when
9
+ * the pi backend is selected.
10
+ */
11
+ import type { LLMBackend } from '../types.js';
12
+ export type BackendKind = 'env' | 'pi';
13
+ export interface PiBackendConfig {
14
+ kind?: BackendKind;
15
+ agentDir?: string;
16
+ modelsPath?: string | null;
17
+ authPath?: string | null;
18
+ model?: string;
19
+ /** Requested thinking level for reasoning models (see `ThinkingLevel`). */
20
+ thinkingLevel?: string;
21
+ }
22
+ export interface ResolvedBackendPaths {
23
+ agentDir: string;
24
+ modelsPath: string;
25
+ authPath: string;
26
+ model?: string;
27
+ }
28
+ /** Minimal structural view of pi's ModelRegistry used by the adapter. */
29
+ export interface PiModelLike {
30
+ provider: string;
31
+ id: string;
32
+ api?: string;
33
+ /** Whether the model accepts a thinking/reasoning level. */
34
+ reasoning?: boolean;
35
+ /** Model context window in tokens. */
36
+ contextWindow?: number;
37
+ /** Maximum output tokens. */
38
+ maxTokens?: number;
39
+ /** Maps pi thinking levels to provider values; `null` marks a level unsupported. */
40
+ thinkingLevelMap?: Partial<Record<ThinkingLevel, string | null>>;
41
+ }
42
+ /** pi's thinking levels, in ascending effort order. */
43
+ export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
44
+ export declare const THINKING_LEVELS: readonly ThinkingLevel[];
45
+ /** Levels a model accepts: reasoning models expose all but explicitly-unsupported ones. */
46
+ export declare function supportedThinkingLevels(model: PiModelLike): ThinkingLevel[];
47
+ /**
48
+ * Validate a requested thinking level against the model. Returns the level to
49
+ * pass through (or `undefined` for the provider default) plus a warning when a
50
+ * request had to be dropped.
51
+ */
52
+ export declare function resolveThinkingLevel(model: PiModelLike, requested?: string): {
53
+ level?: ThinkingLevel;
54
+ supported: ThinkingLevel[];
55
+ warning?: string;
56
+ };
57
+ export interface PiCompletionRequest {
58
+ systemPrompt?: string;
59
+ messages: unknown[];
60
+ tools?: unknown[];
61
+ }
62
+ export interface PiCompletionResult {
63
+ content: Array<{
64
+ type: 'text';
65
+ text: string;
66
+ } | {
67
+ type: 'toolCall';
68
+ id: string;
69
+ name: string;
70
+ arguments: Record<string, unknown>;
71
+ }>;
72
+ usage: {
73
+ input: number;
74
+ output: number;
75
+ totalTokens: number;
76
+ cacheRead?: number;
77
+ cacheWrite?: number;
78
+ reasoning?: number;
79
+ };
80
+ stopReason: 'stop' | 'toolUse' | 'length' | 'error' | 'aborted';
81
+ errorMessage?: string;
82
+ }
83
+ export interface PiStreamEventLike {
84
+ type: string;
85
+ delta?: string;
86
+ }
87
+ export interface PiStreamLike extends AsyncIterable<PiStreamEventLike> {
88
+ result(): Promise<PiCompletionResult>;
89
+ }
90
+ export interface PiRegistryLike {
91
+ getAvailable(): PiModelLike[];
92
+ find?(provider: string, modelId: string): PiModelLike | undefined;
93
+ hasConfiguredAuth(model: PiModelLike): boolean;
94
+ complete(model: PiModelLike, context: PiCompletionRequest, options: unknown): Promise<PiCompletionResult>;
95
+ /** Streaming API; when present, `complete` forwards text/thinking deltas. */
96
+ streamSimple?(model: PiModelLike, context: PiCompletionRequest, options: unknown): PiStreamLike;
97
+ }
98
+ /** Resolve pi's agent dir, models.json, and auth.json paths. */
99
+ export declare function resolvePiPaths(config: PiBackendConfig, defaults: {
100
+ agentDir: string;
101
+ }): ResolvedBackendPaths;
102
+ /** Select the pi model to use, honoring an explicit provider/model request. */
103
+ export declare function selectPiModel(registry: PiRegistryLike, requested?: string): PiModelLike;
104
+ /**
105
+ * Wrap a pi registry + model as an SDK `LLMBackend`. Reused by the extension
106
+ * embedding, which passes its live registry.
107
+ *
108
+ * `thinkingLevel` is forwarded to the provider only for reasoning models and
109
+ * non-`off` levels, so provider defaults are preserved for every other model.
110
+ */
111
+ export declare function createPiAdapter(registry: PiRegistryLike, model: PiModelLike, maxTokens?: number, thinkingLevel?: string): {
112
+ backend: LLMBackend;
113
+ modelId: string;
114
+ provider: string;
115
+ contextWindow?: number;
116
+ maxTokens: number;
117
+ reasoning: boolean;
118
+ thinkingLevel?: ThinkingLevel;
119
+ supportedThinkingLevels: ThinkingLevel[];
120
+ warning?: string;
121
+ };
122
+ export interface CreatePiBackendOptions extends PiBackendConfig {
123
+ maxTokens?: number;
124
+ /** Injected registry (used by tests and by a pi embedding). */
125
+ modelRegistry?: PiRegistryLike;
126
+ }
127
+ /** Structural view of pi's runtime used for setup/catalog/auth operations. */
128
+ export interface PiRuntimeLike {
129
+ getProviders(): Array<{
130
+ id: string;
131
+ name?: string;
132
+ auth?: {
133
+ apiKey?: unknown;
134
+ oauth?: {
135
+ isSubscription?: boolean;
136
+ };
137
+ };
138
+ }>;
139
+ getProvider(providerId: string): {
140
+ id: string;
141
+ name?: string;
142
+ auth?: {
143
+ apiKey?: unknown;
144
+ oauth?: {
145
+ isSubscription?: boolean;
146
+ };
147
+ };
148
+ } | undefined;
149
+ getModels(providerId?: string): PiModelLike[];
150
+ hasConfiguredAuth(providerId: string): boolean;
151
+ getProviderAuthStatus(providerId: string): {
152
+ configured: boolean;
153
+ label?: string;
154
+ source?: string;
155
+ };
156
+ isUsingOAuth(providerId: string): boolean;
157
+ listCredentials(options?: unknown): Promise<Array<{
158
+ providerId: string;
159
+ type: string;
160
+ }>>;
161
+ login(providerId: string, type: string, interaction: unknown, options?: unknown): Promise<unknown>;
162
+ logout(providerId: string, options?: unknown): Promise<void>;
163
+ }
164
+ export interface PiProviderInfo {
165
+ id: string;
166
+ name: string;
167
+ apiKey: boolean;
168
+ oauth: boolean;
169
+ configured: boolean;
170
+ source?: string;
171
+ label?: string;
172
+ }
173
+ export interface PiModelInfo {
174
+ provider: string;
175
+ id: string;
176
+ name: string;
177
+ reasoning: boolean;
178
+ contextWindow?: number;
179
+ maxTokens?: number;
180
+ /** Thinking levels the model accepts (empty/undefined for non-reasoning). */
181
+ supportedThinkingLevels?: ThinkingLevel[];
182
+ }
183
+ /** Build the catalog `PiModelInfo` (with reasoning levels) from a raw model. */
184
+ export declare function toPiModelInfo(model: PiModelLike & {
185
+ name?: string;
186
+ }): PiModelInfo;
187
+ export interface PiAuthPromptLike {
188
+ signal?: AbortSignal;
189
+ type: 'text' | 'secret' | 'select' | 'manual_code';
190
+ message: string;
191
+ placeholder?: string;
192
+ options?: ReadonlyArray<{
193
+ id: string;
194
+ label: string;
195
+ description?: string;
196
+ }>;
197
+ }
198
+ export interface PiAuthEventLike {
199
+ type: 'info' | 'auth_url' | 'device_code' | 'progress';
200
+ message?: string;
201
+ url?: string;
202
+ instructions?: string;
203
+ userCode?: string;
204
+ verificationUri?: string;
205
+ links?: ReadonlyArray<{
206
+ url: string;
207
+ label?: string;
208
+ }>;
209
+ }
210
+ export interface PiAuthInteractionLike {
211
+ signal?: AbortSignal;
212
+ prompt(prompt: PiAuthPromptLike): Promise<string>;
213
+ notify(event: PiAuthEventLike): void;
214
+ }
215
+ /** List providers from a pi runtime with auth capability/status. */
216
+ export declare function listPiProviders(runtime: PiRuntimeLike): PiProviderInfo[];
217
+ /** List chat models from a pi runtime, optionally filtered by provider. */
218
+ export declare function listPiModels(runtime: PiRuntimeLike, providerId?: string): PiModelInfo[];
219
+ /** A pi runtime handle: the model registry plus catalog/auth operations. */
220
+ export interface PiRuntimeHandle {
221
+ registry: PiRegistryLike;
222
+ runtime: PiRuntimeLike;
223
+ listProviders(): PiProviderInfo[];
224
+ listModels(providerId?: string): PiModelInfo[];
225
+ hasAuth(providerId: string): boolean;
226
+ isUsingOAuth(providerId: string): boolean;
227
+ listCredentials(): Promise<Array<{
228
+ providerId: string;
229
+ type: string;
230
+ }>>;
231
+ login(providerId: string, interaction: PiAuthInteractionLike, type?: 'api_key' | 'oauth'): Promise<void>;
232
+ logout(providerId: string): Promise<void>;
233
+ }
234
+ /** Whether the pi dependency resolves (it is a required dependency of the SDK). */
235
+ export declare function isPiPackageAvailable(): boolean;
236
+ /**
237
+ * Open a pi runtime using an existing install's credential store and model
238
+ * catalog. This is the setup entry point used by `set-backend pi`; it does not
239
+ * require the pi CLI or a pre-existing pi session.
240
+ */
241
+ export declare function openPiRuntime(options?: CreatePiBackendOptions): Promise<PiRuntimeHandle>;
242
+ /** Resolved pi backend plus the model capabilities the UI/config needs. */
243
+ export interface PiBackendInfo {
244
+ backend: LLMBackend;
245
+ modelId: string;
246
+ provider: string;
247
+ contextWindow?: number;
248
+ maxTokens: number;
249
+ reasoning: boolean;
250
+ thinkingLevel?: ThinkingLevel;
251
+ supportedThinkingLevels: ThinkingLevel[];
252
+ /** Set when a requested thinking level was unsupported and dropped. */
253
+ warning?: string;
254
+ }
255
+ /**
256
+ * Build an `LLMBackend` from pi's credential store. Throws a clear error when
257
+ * the pi packages are not installed.
258
+ */
259
+ export declare function createPiBackend(options?: CreatePiBackendOptions): Promise<PiBackendInfo>;
260
+ export interface ResolveBackendOptions {
261
+ kind?: BackendKind;
262
+ model?: string;
263
+ provider?: string;
264
+ maxTokens?: number;
265
+ agentDir?: string;
266
+ modelsPath?: string | null;
267
+ authPath?: string | null;
268
+ thinkingLevel?: string;
269
+ }
270
+ export interface ResolvedBackend {
271
+ kind: BackendKind;
272
+ /** Injected backend for pi; undefined for env (the runner builds it). */
273
+ llmBackend?: LLMBackend;
274
+ provider: string;
275
+ /** Bare model id. */
276
+ model: string;
277
+ /** `provider/model` (pi) or bare id (env), for display/persistence. */
278
+ modelId: string;
279
+ /** pi model capabilities (undefined for env). */
280
+ contextWindow?: number;
281
+ reasoning?: boolean;
282
+ thinkingLevel?: ThinkingLevel;
283
+ }
284
+ /**
285
+ * Resolve the shared pi/env model backend used by both `deepclause run` and the
286
+ * REPL. `pi` (the default) returns an injected `LLMBackend`; `env` returns the
287
+ * provider/model so the runner builds the SDK provider backend.
288
+ */
289
+ export declare function resolveLlmBackend(options?: ResolveBackendOptions): Promise<ResolvedBackend>;
290
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/repl/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Backend resolution for the REPL (M5).
3
+ *
4
+ * `env` uses the SDK's provider/API-key backend (unchanged). `pi` reuses pi's
5
+ * own model registry and credential store so the REPL runs against the model
6
+ * configured in pi, without asking for API keys or writing provider env vars.
7
+ *
8
+ * The pi packages are optional peers and loaded with a dynamic import only when
9
+ * the pi backend is selected.
10
+ */
11
+ import * as path from 'path';
12
+ export const THINKING_LEVELS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
13
+ /** Levels a model accepts: reasoning models expose all but explicitly-unsupported ones. */
14
+ export function supportedThinkingLevels(model) {
15
+ if (!model.reasoning) {
16
+ return ['off'];
17
+ }
18
+ return THINKING_LEVELS.filter((level) => model.thinkingLevelMap?.[level] !== null);
19
+ }
20
+ /**
21
+ * Validate a requested thinking level against the model. Returns the level to
22
+ * pass through (or `undefined` for the provider default) plus a warning when a
23
+ * request had to be dropped.
24
+ */
25
+ export function resolveThinkingLevel(model, requested) {
26
+ const supported = supportedThinkingLevels(model);
27
+ if (!requested) {
28
+ return { level: undefined, supported };
29
+ }
30
+ if (THINKING_LEVELS.includes(requested) && supported.includes(requested)) {
31
+ return { level: requested, supported };
32
+ }
33
+ return {
34
+ level: undefined,
35
+ supported,
36
+ warning: `thinking level '${requested}' is not supported by ${model.provider}/${model.id}; using the provider default`,
37
+ };
38
+ }
39
+ /** Resolve pi's agent dir, models.json, and auth.json paths. */
40
+ export function resolvePiPaths(config, defaults) {
41
+ const agentDir = config.agentDir ?? defaults.agentDir;
42
+ return {
43
+ agentDir,
44
+ modelsPath: config.modelsPath ?? path.join(agentDir, 'models.json'),
45
+ authPath: config.authPath ?? path.join(agentDir, 'auth.json'),
46
+ model: config.model,
47
+ };
48
+ }
49
+ function modelLabel(model) {
50
+ return `${model.provider}/${model.id}`;
51
+ }
52
+ /** Select the pi model to use, honoring an explicit provider/model request. */
53
+ export function selectPiModel(registry, requested) {
54
+ const available = registry.getAvailable();
55
+ if (available.length === 0) {
56
+ throw new Error('pi has no configured models; run pi or `deepclause set-backend env`');
57
+ }
58
+ if (requested) {
59
+ const normalized = requested.replace(':', '/');
60
+ const [provider, ...rest] = normalized.split('/');
61
+ const modelId = rest.join('/');
62
+ if (modelId && registry.find) {
63
+ const found = registry.find(provider, modelId);
64
+ if (found)
65
+ return found;
66
+ }
67
+ const byId = available.find((model) => model.id === requested || modelLabel(model) === requested);
68
+ if (byId)
69
+ return byId;
70
+ throw new Error(`pi model not found: ${requested}`);
71
+ }
72
+ return available[0];
73
+ }
74
+ function emptyUsage() {
75
+ return { input: 0, output: 0, totalTokens: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0 };
76
+ }
77
+ function toPiMessages(messages, model) {
78
+ return messages
79
+ .filter((message) => message.role !== 'system')
80
+ .map((message) => {
81
+ if (message.role === 'assistant' && message.providerData) {
82
+ return message.providerData;
83
+ }
84
+ if (message.role === 'user') {
85
+ // Attach resolved media as pi image content blocks alongside the text.
86
+ const content = message.media && message.media.length > 0
87
+ ? [
88
+ ...(message.content ? [{ type: 'text', text: message.content }] : []),
89
+ ...message.media.map((media) => ({
90
+ type: 'image',
91
+ data: media.data,
92
+ mimeType: media.mimeType,
93
+ })),
94
+ ]
95
+ : message.content;
96
+ return { role: 'user', content, timestamp: Date.now() };
97
+ }
98
+ if (message.role === 'tool') {
99
+ return {
100
+ role: 'toolResult',
101
+ toolCallId: message.toolCallId ?? 'unknown',
102
+ toolName: message.toolName ?? 'unknown',
103
+ content: [{ type: 'text', text: message.content }],
104
+ isError: false,
105
+ timestamp: Date.now(),
106
+ };
107
+ }
108
+ return {
109
+ role: 'assistant',
110
+ content: [
111
+ ...(message.content ? [{ type: 'text', text: message.content }] : []),
112
+ ...(message.toolCalls ?? []).map((call) => ({
113
+ type: 'toolCall',
114
+ id: call.id,
115
+ name: call.name,
116
+ arguments: call.arguments,
117
+ })),
118
+ ],
119
+ api: model.api,
120
+ provider: model.provider,
121
+ model: model.id,
122
+ usage: emptyUsage(),
123
+ stopReason: message.toolCalls?.length ? 'toolUse' : 'stop',
124
+ timestamp: Date.now(),
125
+ };
126
+ });
127
+ }
128
+ /**
129
+ * Wrap a pi registry + model as an SDK `LLMBackend`. Reused by the extension
130
+ * embedding, which passes its live registry.
131
+ *
132
+ * `thinkingLevel` is forwarded to the provider only for reasoning models and
133
+ * non-`off` levels, so provider defaults are preserved for every other model.
134
+ */
135
+ export function createPiAdapter(registry, model, maxTokens = 65536, thinkingLevel) {
136
+ if (!registry.hasConfiguredAuth(model)) {
137
+ throw new Error(`pi has no configured authentication for ${modelLabel(model)}`);
138
+ }
139
+ const resolved = resolveThinkingLevel(model, thinkingLevel);
140
+ const backend = {
141
+ async complete(request) {
142
+ const systemPrompt = request.messages
143
+ .filter((message) => message.role === 'system')
144
+ .map((message) => message.content)
145
+ .join('\n\n');
146
+ const context = {
147
+ systemPrompt: systemPrompt || undefined,
148
+ messages: toPiMessages(request.messages, model),
149
+ tools: request.tools?.map((tool) => ({
150
+ name: tool.name,
151
+ description: tool.description,
152
+ parameters: tool.parameters,
153
+ })),
154
+ };
155
+ const options = {
156
+ signal: request.signal,
157
+ maxTokens: request.maxTokens ?? maxTokens,
158
+ cacheRetention: 'none',
159
+ };
160
+ if (model.reasoning && resolved.level && resolved.level !== 'off') {
161
+ // pi's `SimpleStreamOptions` enables thinking with `reasoning` (a
162
+ // ThinkingLevel), not `thinkingLevel`.
163
+ options.reasoning = resolved.level;
164
+ }
165
+ let response;
166
+ if (registry.streamSimple) {
167
+ // Stream text/thinking deltas as they arrive; the final message carries
168
+ // the full text, tool calls, and usage.
169
+ const stream = registry.streamSimple(model, context, options);
170
+ for await (const event of stream) {
171
+ if (event.type === 'text_delta') {
172
+ if (event.delta)
173
+ request.onText?.(event.delta);
174
+ }
175
+ else if (event.type === 'thinking_delta') {
176
+ if (event.delta)
177
+ request.onReasoning?.(event.delta);
178
+ }
179
+ }
180
+ response = await stream.result();
181
+ }
182
+ else {
183
+ response = await registry.complete(model, context, options);
184
+ const streamedText = response.content
185
+ .filter((content) => content.type === 'text')
186
+ .map((content) => content.text)
187
+ .join('');
188
+ if (streamedText)
189
+ request.onText?.(streamedText);
190
+ }
191
+ if (response.stopReason === 'error' || response.stopReason === 'aborted') {
192
+ throw new Error(response.errorMessage || `pi model request ${response.stopReason}`);
193
+ }
194
+ const text = response.content
195
+ .filter((content) => content.type === 'text')
196
+ .map((content) => content.text)
197
+ .join('');
198
+ return {
199
+ text,
200
+ toolCalls: response.content
201
+ .filter((content) => content.type === 'toolCall')
202
+ .map((call) => ({ id: call.id, name: call.name, arguments: call.arguments })),
203
+ usage: {
204
+ inputTokens: response.usage.input,
205
+ outputTokens: response.usage.output,
206
+ totalTokens: response.usage.totalTokens,
207
+ cacheReadTokens: response.usage.cacheRead || undefined,
208
+ cacheWriteTokens: response.usage.cacheWrite || undefined,
209
+ reasoningTokens: response.usage.reasoning || undefined,
210
+ },
211
+ finishReason: response.stopReason === 'toolUse'
212
+ ? 'tool_use'
213
+ : response.stopReason === 'length'
214
+ ? 'length'
215
+ : 'stop',
216
+ providerData: response,
217
+ };
218
+ },
219
+ };
220
+ return {
221
+ backend,
222
+ modelId: modelLabel(model),
223
+ provider: model.provider,
224
+ contextWindow: model.contextWindow,
225
+ maxTokens,
226
+ reasoning: Boolean(model.reasoning),
227
+ thinkingLevel: resolved.level,
228
+ supportedThinkingLevels: resolved.supported,
229
+ warning: resolved.warning,
230
+ };
231
+ }
232
+ const PI_PACKAGE_NAME = '@earendil-works/pi-coding-agent';
233
+ /**
234
+ * Import the pi coding agent. It is a regular dependency of this SDK, so the
235
+ * bare specifier always resolves; a globally installed `pi` is deliberately
236
+ * not consulted, which keeps the version deterministic.
237
+ */
238
+ async function importPiModule() {
239
+ try {
240
+ return (await import(PI_PACKAGE_NAME));
241
+ }
242
+ catch {
243
+ throw new Error(`Backend 'pi' requires ${PI_PACKAGE_NAME} (a dependency of this SDK). `
244
+ + 'Reinstall dependencies, or run `deepclause set-backend env` to use the SDK provider/API-key backend.');
245
+ }
246
+ }
247
+ /** Build the catalog `PiModelInfo` (with reasoning levels) from a raw model. */
248
+ export function toPiModelInfo(model) {
249
+ return {
250
+ provider: model.provider,
251
+ id: model.id,
252
+ name: model.name ?? model.id,
253
+ reasoning: Boolean(model.reasoning),
254
+ contextWindow: model.contextWindow,
255
+ maxTokens: model.maxTokens,
256
+ supportedThinkingLevels: supportedThinkingLevels(model),
257
+ };
258
+ }
259
+ /** List providers from a pi runtime with auth capability/status. */
260
+ export function listPiProviders(runtime) {
261
+ return runtime.getProviders().map((provider) => {
262
+ const status = runtime.getProviderAuthStatus(provider.id);
263
+ return {
264
+ id: provider.id,
265
+ name: provider.name ?? provider.id,
266
+ apiKey: Boolean(provider.auth?.apiKey),
267
+ oauth: Boolean(provider.auth?.oauth),
268
+ configured: status?.configured ?? runtime.hasConfiguredAuth(provider.id),
269
+ source: status?.source,
270
+ label: status?.label,
271
+ };
272
+ });
273
+ }
274
+ /** List chat models from a pi runtime, optionally filtered by provider. */
275
+ export function listPiModels(runtime, providerId) {
276
+ return runtime.getModels(providerId).map((model) => toPiModelInfo(model));
277
+ }
278
+ /** Whether the pi dependency resolves (it is a required dependency of the SDK). */
279
+ export function isPiPackageAvailable() {
280
+ try {
281
+ const resolve = import.meta.resolve;
282
+ return typeof resolve === 'function' && Boolean(resolve(PI_PACKAGE_NAME));
283
+ }
284
+ catch {
285
+ return false;
286
+ }
287
+ }
288
+ /**
289
+ * Open a pi runtime using an existing install's credential store and model
290
+ * catalog. This is the setup entry point used by `set-backend pi`; it does not
291
+ * require the pi CLI or a pre-existing pi session.
292
+ */
293
+ export async function openPiRuntime(options = {}) {
294
+ const pi = await importPiModule();
295
+ const paths = resolvePiPaths(options, { agentDir: pi.getAgentDir() });
296
+ const runtime = (await pi.ModelRuntime.create({
297
+ authPath: paths.authPath,
298
+ modelsPath: paths.modelsPath,
299
+ allowModelNetwork: false,
300
+ }));
301
+ const registry = options.modelRegistry ?? new pi.ModelRegistry(runtime);
302
+ return {
303
+ registry,
304
+ runtime,
305
+ listProviders: () => listPiProviders(runtime),
306
+ listModels: (providerId) => listPiModels(runtime, providerId),
307
+ hasAuth: (providerId) => runtime.hasConfiguredAuth(providerId),
308
+ isUsingOAuth: (providerId) => runtime.isUsingOAuth(providerId),
309
+ listCredentials: async () => (await runtime.listCredentials()) ?? [],
310
+ login: async (providerId, interaction, type) => {
311
+ const authType = type ?? 'api_key';
312
+ await runtime.login(providerId, authType, interaction, {});
313
+ },
314
+ logout: async (providerId) => {
315
+ await runtime.logout(providerId);
316
+ },
317
+ };
318
+ }
319
+ /**
320
+ * Build an `LLMBackend` from pi's credential store. Throws a clear error when
321
+ * the pi packages are not installed.
322
+ */
323
+ export async function createPiBackend(options = {}) {
324
+ let registry = options.modelRegistry;
325
+ let requested = options.model;
326
+ if (!registry) {
327
+ const pi = await importPiModule();
328
+ const paths = resolvePiPaths(options, { agentDir: pi.getAgentDir() });
329
+ requested = requested ?? paths.model;
330
+ const runtime = await pi.ModelRuntime.create({
331
+ authPath: paths.authPath,
332
+ modelsPath: paths.modelsPath,
333
+ allowModelNetwork: false,
334
+ });
335
+ registry = new pi.ModelRegistry(runtime);
336
+ }
337
+ const model = selectPiModel(registry, requested);
338
+ return createPiAdapter(registry, model, options.maxTokens, options.thinkingLevel);
339
+ }
340
+ /**
341
+ * Resolve the shared pi/env model backend used by both `deepclause run` and the
342
+ * REPL. `pi` (the default) returns an injected `LLMBackend`; `env` returns the
343
+ * provider/model so the runner builds the SDK provider backend.
344
+ */
345
+ export async function resolveLlmBackend(options = {}) {
346
+ const kind = options.kind ?? 'pi';
347
+ if (kind === 'pi') {
348
+ const pi = await createPiBackend({
349
+ agentDir: options.agentDir,
350
+ modelsPath: options.modelsPath ?? undefined,
351
+ authPath: options.authPath ?? undefined,
352
+ model: options.model,
353
+ maxTokens: options.maxTokens,
354
+ thinkingLevel: options.thinkingLevel,
355
+ });
356
+ return {
357
+ kind: 'pi',
358
+ llmBackend: pi.backend,
359
+ provider: pi.provider,
360
+ model: pi.modelId.split('/').slice(1).join('/') || pi.modelId,
361
+ modelId: pi.modelId,
362
+ contextWindow: pi.contextWindow,
363
+ reasoning: pi.reasoning,
364
+ thinkingLevel: pi.thinkingLevel,
365
+ };
366
+ }
367
+ const model = options.model ?? 'gpt-4o';
368
+ return { kind: 'env', provider: options.provider ?? 'openai', model, modelId: model };
369
+ }
370
+ //# sourceMappingURL=backend.js.map