tuplet 2.7.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 (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/dist/agent.d.ts +46 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +393 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/built-in-agents/explore.d.ts +9 -0
  8. package/dist/built-in-agents/explore.d.ts.map +1 -0
  9. package/dist/built-in-agents/explore.js +40 -0
  10. package/dist/built-in-agents/explore.js.map +1 -0
  11. package/dist/built-in-agents/index.d.ts +15 -0
  12. package/dist/built-in-agents/index.d.ts.map +1 -0
  13. package/dist/built-in-agents/index.js +19 -0
  14. package/dist/built-in-agents/index.js.map +1 -0
  15. package/dist/built-in-agents/plan.d.ts +10 -0
  16. package/dist/built-in-agents/plan.d.ts.map +1 -0
  17. package/dist/built-in-agents/plan.js +62 -0
  18. package/dist/built-in-agents/plan.js.map +1 -0
  19. package/dist/built-in-agents/worker.d.ts +9 -0
  20. package/dist/built-in-agents/worker.d.ts.map +1 -0
  21. package/dist/built-in-agents/worker.js +53 -0
  22. package/dist/built-in-agents/worker.js.map +1 -0
  23. package/dist/constants.d.ts +7 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +18 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/context-manager.d.ts +65 -0
  28. package/dist/context-manager.d.ts.map +1 -0
  29. package/dist/context-manager.js +272 -0
  30. package/dist/context-manager.js.map +1 -0
  31. package/dist/context-manager.test.d.ts +2 -0
  32. package/dist/context-manager.test.d.ts.map +1 -0
  33. package/dist/context-manager.test.js +394 -0
  34. package/dist/context-manager.test.js.map +1 -0
  35. package/dist/executor.d.ts +29 -0
  36. package/dist/executor.d.ts.map +1 -0
  37. package/dist/executor.js +399 -0
  38. package/dist/executor.js.map +1 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +40 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/prompt/index.d.ts +9 -0
  44. package/dist/prompt/index.d.ts.map +1 -0
  45. package/dist/prompt/index.js +10 -0
  46. package/dist/prompt/index.js.map +1 -0
  47. package/dist/prompt/main-agent-builder.d.ts +81 -0
  48. package/dist/prompt/main-agent-builder.d.ts.map +1 -0
  49. package/dist/prompt/main-agent-builder.js +287 -0
  50. package/dist/prompt/main-agent-builder.js.map +1 -0
  51. package/dist/prompt/sub-agent-builder.d.ts +133 -0
  52. package/dist/prompt/sub-agent-builder.d.ts.map +1 -0
  53. package/dist/prompt/sub-agent-builder.js +337 -0
  54. package/dist/prompt/sub-agent-builder.js.map +1 -0
  55. package/dist/prompt/templates.d.ts +87 -0
  56. package/dist/prompt/templates.d.ts.map +1 -0
  57. package/dist/prompt/templates.js +343 -0
  58. package/dist/prompt/templates.js.map +1 -0
  59. package/dist/prompt/types.d.ts +159 -0
  60. package/dist/prompt/types.d.ts.map +1 -0
  61. package/dist/prompt/types.js +5 -0
  62. package/dist/prompt/types.js.map +1 -0
  63. package/dist/prompt.d.ts +32 -0
  64. package/dist/prompt.d.ts.map +1 -0
  65. package/dist/prompt.js +86 -0
  66. package/dist/prompt.js.map +1 -0
  67. package/dist/providers/dataset/base.d.ts +74 -0
  68. package/dist/providers/dataset/base.d.ts.map +1 -0
  69. package/dist/providers/dataset/base.js +7 -0
  70. package/dist/providers/dataset/base.js.map +1 -0
  71. package/dist/providers/dataset/index.d.ts +8 -0
  72. package/dist/providers/dataset/index.d.ts.map +1 -0
  73. package/dist/providers/dataset/index.js +8 -0
  74. package/dist/providers/dataset/index.js.map +1 -0
  75. package/dist/providers/dataset/recorder.d.ts +46 -0
  76. package/dist/providers/dataset/recorder.d.ts.map +1 -0
  77. package/dist/providers/dataset/recorder.js +105 -0
  78. package/dist/providers/dataset/recorder.js.map +1 -0
  79. package/dist/providers/dataset/replayer.d.ts +46 -0
  80. package/dist/providers/dataset/replayer.d.ts.map +1 -0
  81. package/dist/providers/dataset/replayer.js +163 -0
  82. package/dist/providers/dataset/replayer.js.map +1 -0
  83. package/dist/providers/dataset/tester.d.ts +89 -0
  84. package/dist/providers/dataset/tester.d.ts.map +1 -0
  85. package/dist/providers/dataset/tester.js +143 -0
  86. package/dist/providers/dataset/tester.js.map +1 -0
  87. package/dist/providers/env/memory.d.ts +14 -0
  88. package/dist/providers/env/memory.d.ts.map +1 -0
  89. package/dist/providers/env/memory.js +19 -0
  90. package/dist/providers/env/memory.js.map +1 -0
  91. package/dist/providers/index.d.ts +12 -0
  92. package/dist/providers/index.d.ts.map +1 -0
  93. package/dist/providers/index.js +10 -0
  94. package/dist/providers/index.js.map +1 -0
  95. package/dist/providers/llm/base.d.ts +7 -0
  96. package/dist/providers/llm/base.d.ts.map +1 -0
  97. package/dist/providers/llm/base.js +7 -0
  98. package/dist/providers/llm/base.js.map +1 -0
  99. package/dist/providers/llm/claude.d.ts +32 -0
  100. package/dist/providers/llm/claude.d.ts.map +1 -0
  101. package/dist/providers/llm/claude.js +171 -0
  102. package/dist/providers/llm/claude.js.map +1 -0
  103. package/dist/providers/llm/openai.d.ts +26 -0
  104. package/dist/providers/llm/openai.d.ts.map +1 -0
  105. package/dist/providers/llm/openai.js +174 -0
  106. package/dist/providers/llm/openai.js.map +1 -0
  107. package/dist/providers/llm/openrouter.d.ts +43 -0
  108. package/dist/providers/llm/openrouter.d.ts.map +1 -0
  109. package/dist/providers/llm/openrouter.js +288 -0
  110. package/dist/providers/llm/openrouter.js.map +1 -0
  111. package/dist/providers/logger/base.d.ts +7 -0
  112. package/dist/providers/logger/base.d.ts.map +1 -0
  113. package/dist/providers/logger/base.js +7 -0
  114. package/dist/providers/logger/base.js.map +1 -0
  115. package/dist/providers/logger/console.d.ts +29 -0
  116. package/dist/providers/logger/console.d.ts.map +1 -0
  117. package/dist/providers/logger/console.js +70 -0
  118. package/dist/providers/logger/console.js.map +1 -0
  119. package/dist/providers/repository/base.d.ts +7 -0
  120. package/dist/providers/repository/base.d.ts.map +1 -0
  121. package/dist/providers/repository/base.js +7 -0
  122. package/dist/providers/repository/base.js.map +1 -0
  123. package/dist/providers/repository/memory.d.ts +21 -0
  124. package/dist/providers/repository/memory.d.ts.map +1 -0
  125. package/dist/providers/repository/memory.js +50 -0
  126. package/dist/providers/repository/memory.js.map +1 -0
  127. package/dist/providers/workspace/file.d.ts +26 -0
  128. package/dist/providers/workspace/file.d.ts.map +1 -0
  129. package/dist/providers/workspace/file.js +151 -0
  130. package/dist/providers/workspace/file.js.map +1 -0
  131. package/dist/providers/workspace/index.d.ts +7 -0
  132. package/dist/providers/workspace/index.d.ts.map +1 -0
  133. package/dist/providers/workspace/index.js +6 -0
  134. package/dist/providers/workspace/index.js.map +1 -0
  135. package/dist/providers/workspace/memory.d.ts +26 -0
  136. package/dist/providers/workspace/memory.d.ts.map +1 -0
  137. package/dist/providers/workspace/memory.js +136 -0
  138. package/dist/providers/workspace/memory.js.map +1 -0
  139. package/dist/providers/workspace/types.d.ts +27 -0
  140. package/dist/providers/workspace/types.d.ts.map +1 -0
  141. package/dist/providers/workspace/types.js +8 -0
  142. package/dist/providers/workspace/types.js.map +1 -0
  143. package/dist/providers/workspace/workspace-provider.test.d.ts +2 -0
  144. package/dist/providers/workspace/workspace-provider.test.d.ts.map +1 -0
  145. package/dist/providers/workspace/workspace-provider.test.js +250 -0
  146. package/dist/providers/workspace/workspace-provider.test.js.map +1 -0
  147. package/dist/shell/commands/browse.d.ts +6 -0
  148. package/dist/shell/commands/browse.d.ts.map +1 -0
  149. package/dist/shell/commands/browse.js +158 -0
  150. package/dist/shell/commands/browse.js.map +1 -0
  151. package/dist/shell/commands/cat.d.ts +6 -0
  152. package/dist/shell/commands/cat.d.ts.map +1 -0
  153. package/dist/shell/commands/cat.js +104 -0
  154. package/dist/shell/commands/cat.js.map +1 -0
  155. package/dist/shell/commands/curl.d.ts +6 -0
  156. package/dist/shell/commands/curl.d.ts.map +1 -0
  157. package/dist/shell/commands/curl.js +190 -0
  158. package/dist/shell/commands/curl.js.map +1 -0
  159. package/dist/shell/commands/date.d.ts +6 -0
  160. package/dist/shell/commands/date.d.ts.map +1 -0
  161. package/dist/shell/commands/date.js +151 -0
  162. package/dist/shell/commands/date.js.map +1 -0
  163. package/dist/shell/commands/echo.d.ts +6 -0
  164. package/dist/shell/commands/echo.d.ts.map +1 -0
  165. package/dist/shell/commands/echo.js +48 -0
  166. package/dist/shell/commands/echo.js.map +1 -0
  167. package/dist/shell/commands/env.d.ts +8 -0
  168. package/dist/shell/commands/env.d.ts.map +1 -0
  169. package/dist/shell/commands/env.js +41 -0
  170. package/dist/shell/commands/env.js.map +1 -0
  171. package/dist/shell/commands/file.d.ts +6 -0
  172. package/dist/shell/commands/file.d.ts.map +1 -0
  173. package/dist/shell/commands/file.js +213 -0
  174. package/dist/shell/commands/file.js.map +1 -0
  175. package/dist/shell/commands/find.d.ts +6 -0
  176. package/dist/shell/commands/find.d.ts.map +1 -0
  177. package/dist/shell/commands/find.js +100 -0
  178. package/dist/shell/commands/find.js.map +1 -0
  179. package/dist/shell/commands/grep.d.ts +6 -0
  180. package/dist/shell/commands/grep.d.ts.map +1 -0
  181. package/dist/shell/commands/grep.js +229 -0
  182. package/dist/shell/commands/grep.js.map +1 -0
  183. package/dist/shell/commands/head.d.ts +6 -0
  184. package/dist/shell/commands/head.d.ts.map +1 -0
  185. package/dist/shell/commands/head.js +88 -0
  186. package/dist/shell/commands/head.js.map +1 -0
  187. package/dist/shell/commands/index.d.ts +25 -0
  188. package/dist/shell/commands/index.d.ts.map +1 -0
  189. package/dist/shell/commands/index.js +43 -0
  190. package/dist/shell/commands/index.js.map +1 -0
  191. package/dist/shell/commands/jq.d.ts +8 -0
  192. package/dist/shell/commands/jq.d.ts.map +1 -0
  193. package/dist/shell/commands/jq.js +233 -0
  194. package/dist/shell/commands/jq.js.map +1 -0
  195. package/dist/shell/commands/ls.d.ts +6 -0
  196. package/dist/shell/commands/ls.d.ts.map +1 -0
  197. package/dist/shell/commands/ls.js +88 -0
  198. package/dist/shell/commands/ls.js.map +1 -0
  199. package/dist/shell/commands/mkdir.d.ts +6 -0
  200. package/dist/shell/commands/mkdir.d.ts.map +1 -0
  201. package/dist/shell/commands/mkdir.js +43 -0
  202. package/dist/shell/commands/mkdir.js.map +1 -0
  203. package/dist/shell/commands/rm.d.ts +6 -0
  204. package/dist/shell/commands/rm.d.ts.map +1 -0
  205. package/dist/shell/commands/rm.js +64 -0
  206. package/dist/shell/commands/rm.js.map +1 -0
  207. package/dist/shell/commands/sed.d.ts +6 -0
  208. package/dist/shell/commands/sed.d.ts.map +1 -0
  209. package/dist/shell/commands/sed.js +414 -0
  210. package/dist/shell/commands/sed.js.map +1 -0
  211. package/dist/shell/commands/sort.d.ts +6 -0
  212. package/dist/shell/commands/sort.d.ts.map +1 -0
  213. package/dist/shell/commands/sort.js +109 -0
  214. package/dist/shell/commands/sort.js.map +1 -0
  215. package/dist/shell/commands/tail.d.ts +6 -0
  216. package/dist/shell/commands/tail.d.ts.map +1 -0
  217. package/dist/shell/commands/tail.js +68 -0
  218. package/dist/shell/commands/tail.js.map +1 -0
  219. package/dist/shell/commands/wc.d.ts +6 -0
  220. package/dist/shell/commands/wc.d.ts.map +1 -0
  221. package/dist/shell/commands/wc.js +86 -0
  222. package/dist/shell/commands/wc.js.map +1 -0
  223. package/dist/shell/index.d.ts +10 -0
  224. package/dist/shell/index.d.ts.map +1 -0
  225. package/dist/shell/index.js +10 -0
  226. package/dist/shell/index.js.map +1 -0
  227. package/dist/shell/limits.d.ts +5 -0
  228. package/dist/shell/limits.d.ts.map +1 -0
  229. package/dist/shell/limits.js +5 -0
  230. package/dist/shell/limits.js.map +1 -0
  231. package/dist/shell/parser.d.ts +8 -0
  232. package/dist/shell/parser.d.ts.map +1 -0
  233. package/dist/shell/parser.js +307 -0
  234. package/dist/shell/parser.js.map +1 -0
  235. package/dist/shell/path-validation.d.ts +35 -0
  236. package/dist/shell/path-validation.d.ts.map +1 -0
  237. package/dist/shell/path-validation.js +81 -0
  238. package/dist/shell/path-validation.js.map +1 -0
  239. package/dist/shell/shell.d.ts +66 -0
  240. package/dist/shell/shell.d.ts.map +1 -0
  241. package/dist/shell/shell.js +301 -0
  242. package/dist/shell/shell.js.map +1 -0
  243. package/dist/shell/shell.test.d.ts +2 -0
  244. package/dist/shell/shell.test.d.ts.map +1 -0
  245. package/dist/shell/shell.test.js +1088 -0
  246. package/dist/shell/shell.test.js.map +1 -0
  247. package/dist/shell/types.d.ts +82 -0
  248. package/dist/shell/types.d.ts.map +1 -0
  249. package/dist/shell/types.js +5 -0
  250. package/dist/shell/types.js.map +1 -0
  251. package/dist/summarizer.d.ts +28 -0
  252. package/dist/summarizer.d.ts.map +1 -0
  253. package/dist/summarizer.js +136 -0
  254. package/dist/summarizer.js.map +1 -0
  255. package/dist/summarizer.test.d.ts +2 -0
  256. package/dist/summarizer.test.d.ts.map +1 -0
  257. package/dist/summarizer.test.js +192 -0
  258. package/dist/summarizer.test.js.map +1 -0
  259. package/dist/tools/ask-user.d.ts +11 -0
  260. package/dist/tools/ask-user.d.ts.map +1 -0
  261. package/dist/tools/ask-user.js +35 -0
  262. package/dist/tools/ask-user.js.map +1 -0
  263. package/dist/tools/index.d.ts +11 -0
  264. package/dist/tools/index.d.ts.map +1 -0
  265. package/dist/tools/index.js +18 -0
  266. package/dist/tools/index.js.map +1 -0
  267. package/dist/tools/output.d.ts +15 -0
  268. package/dist/tools/output.d.ts.map +1 -0
  269. package/dist/tools/output.js +40 -0
  270. package/dist/tools/output.js.map +1 -0
  271. package/dist/tools/shell.d.ts +13 -0
  272. package/dist/tools/shell.d.ts.map +1 -0
  273. package/dist/tools/shell.js +166 -0
  274. package/dist/tools/shell.js.map +1 -0
  275. package/dist/tools/sub-agent.d.ts +25 -0
  276. package/dist/tools/sub-agent.d.ts.map +1 -0
  277. package/dist/tools/sub-agent.js +312 -0
  278. package/dist/tools/sub-agent.js.map +1 -0
  279. package/dist/tools/tasks.d.ts +170 -0
  280. package/dist/tools/tasks.d.ts.map +1 -0
  281. package/dist/tools/tasks.js +947 -0
  282. package/dist/tools/tasks.js.map +1 -0
  283. package/dist/trace/builder.d.ts +54 -0
  284. package/dist/trace/builder.d.ts.map +1 -0
  285. package/dist/trace/builder.js +229 -0
  286. package/dist/trace/builder.js.map +1 -0
  287. package/dist/trace/console.d.ts +45 -0
  288. package/dist/trace/console.d.ts.map +1 -0
  289. package/dist/trace/console.js +143 -0
  290. package/dist/trace/console.js.map +1 -0
  291. package/dist/trace/index.d.ts +11 -0
  292. package/dist/trace/index.d.ts.map +1 -0
  293. package/dist/trace/index.js +11 -0
  294. package/dist/trace/index.js.map +1 -0
  295. package/dist/trace/openrouter-pricing.d.ts +9 -0
  296. package/dist/trace/openrouter-pricing.d.ts.map +1 -0
  297. package/dist/trace/openrouter-pricing.js +321 -0
  298. package/dist/trace/openrouter-pricing.js.map +1 -0
  299. package/dist/trace/pricing.d.ts +13 -0
  300. package/dist/trace/pricing.d.ts.map +1 -0
  301. package/dist/trace/pricing.js +41 -0
  302. package/dist/trace/pricing.js.map +1 -0
  303. package/dist/trace/types.d.ts +142 -0
  304. package/dist/trace/types.d.ts.map +1 -0
  305. package/dist/trace/types.js +16 -0
  306. package/dist/trace/types.js.map +1 -0
  307. package/dist/trace.d.ts +5 -0
  308. package/dist/trace.d.ts.map +1 -0
  309. package/dist/trace.js +5 -0
  310. package/dist/trace.js.map +1 -0
  311. package/dist/types.d.ts +382 -0
  312. package/dist/types.d.ts.map +1 -0
  313. package/dist/types.js +5 -0
  314. package/dist/types.js.map +1 -0
  315. package/dist/workspace.d.ts +287 -0
  316. package/dist/workspace.d.ts.map +1 -0
  317. package/dist/workspace.js +560 -0
  318. package/dist/workspace.js.map +1 -0
  319. package/package.json +47 -0
@@ -0,0 +1,560 @@
1
+ /**
2
+ * Workspace - A virtual filesystem for agent communication
3
+ *
4
+ * Wraps a WorkspaceProvider. AI agents interact with workspace
5
+ * using bash-like commands (cat, echo, ls, grep, etc.) through the shell.
6
+ *
7
+ * All paths are relative — absolute paths (starting with /) are not allowed.
8
+ *
9
+ * Usage:
10
+ * ```typescript
11
+ * const workspace = new Workspace({
12
+ * paths: {
13
+ * 'user/preferences.json': { value: { theme: 'dark' } }
14
+ * }
15
+ * })
16
+ *
17
+ * // Get the shell for AI to use
18
+ * const shell = workspace.getShell()
19
+ *
20
+ * // AI uses bash commands:
21
+ * // cat user/preferences.json
22
+ * // echo '{"theme": "light"}' > user/preferences.json
23
+ * // ls
24
+ * // grep "theme" user/preferences.json
25
+ *
26
+ * // Read results after run
27
+ * const prefs = await workspace.read('user/preferences.json')
28
+ * ```
29
+ */
30
+ import { Shell } from './shell/shell.js';
31
+ import { MemoryWorkspaceProvider } from './providers/workspace/memory.js';
32
+ /**
33
+ * Workspace provides a virtual filesystem for agent communication.
34
+ * Uses WorkspaceProvider directly and provides Shell access for AI to use bash commands.
35
+ */
36
+ export class Workspace {
37
+ provider;
38
+ shell;
39
+ validators = new Map();
40
+ definedPaths = new Set();
41
+ strict = false;
42
+ initialized = false;
43
+ unsubscribe;
44
+ /** Extension to type mapping */
45
+ static EXT_MAP = {
46
+ '.json': 'json',
47
+ '.md': 'md',
48
+ '.txt': 'txt',
49
+ '.num': 'num',
50
+ '.bool': 'bool',
51
+ '.schema': 'schema',
52
+ '.zod': 'zod',
53
+ '.validate': 'validate'
54
+ };
55
+ constructor(config) {
56
+ this.strict = config?.strict ?? false;
57
+ this.provider = config?.provider ?? new MemoryWorkspaceProvider();
58
+ this.shell = new Shell({
59
+ ...config?.shell,
60
+ fs: this.provider
61
+ });
62
+ if (config?.paths) {
63
+ for (const [key, value] of Object.entries(config.paths)) {
64
+ this.registerPath(key, value);
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * Get the shell instance for AI to execute bash commands.
70
+ * AI uses: cat, echo, ls, grep, find, curl, jq, etc.
71
+ */
72
+ getShell() {
73
+ return this.shell;
74
+ }
75
+ /**
76
+ * Set environment provider for secure variable resolution in the shell.
77
+ * Variables are resolved at execution time — values never appear in conversation history.
78
+ */
79
+ setEnvProvider(provider) {
80
+ this.shell.setEnvProvider(provider);
81
+ }
82
+ /**
83
+ * Get the underlying WorkspaceProvider
84
+ */
85
+ getProvider() {
86
+ return this.provider;
87
+ }
88
+ /**
89
+ * Initialize the workspace.
90
+ * Sets up real-time subscriptions if the provider supports them.
91
+ * No-op when no provider subscription is available.
92
+ */
93
+ async init() {
94
+ if (this.initialized)
95
+ return;
96
+ this.initialized = true;
97
+ // Subscribe to external changes if provider supports it
98
+ if (this.provider.subscribe) {
99
+ this.unsubscribe = this.provider.subscribe((_changes) => {
100
+ // External changes go directly to the provider — no action needed
101
+ // since Shell reads from provider on demand.
102
+ });
103
+ }
104
+ }
105
+ /**
106
+ * Dispose the workspace provider.
107
+ * Unsubscribes, flushes pending writes, and disposes the provider.
108
+ */
109
+ async dispose() {
110
+ this.unsubscribe?.();
111
+ this.unsubscribe = undefined;
112
+ await this.provider.flush?.();
113
+ await this.provider.dispose?.();
114
+ }
115
+ /**
116
+ * Check if strict mode is enabled
117
+ */
118
+ isStrict() {
119
+ return this.strict;
120
+ }
121
+ /**
122
+ * Check if a path is defined (registered)
123
+ */
124
+ isDefined(path) {
125
+ return this.definedPaths.has(path);
126
+ }
127
+ /**
128
+ * Get all defined paths
129
+ */
130
+ getDefinedPaths() {
131
+ return Array.from(this.definedPaths).sort();
132
+ }
133
+ /**
134
+ * Register a path with optional validator and initial value
135
+ */
136
+ registerPath(path, config) {
137
+ // Always track this as a defined path
138
+ this.definedPaths.add(path);
139
+ // Handle PathConfig (with value and/or validator)
140
+ if (config && typeof config === 'object' && ('value' in config || 'validator' in config || 'description' in config)) {
141
+ const pc = config;
142
+ // Register validator if present
143
+ if (pc.validator !== undefined) {
144
+ this.setValidator(path, pc.validator, pc.description);
145
+ }
146
+ // Set initial value if present
147
+ if (pc.value !== undefined) {
148
+ this.write(path, pc.value, '_init');
149
+ }
150
+ return;
151
+ }
152
+ // Handle direct validator (JSONSchema, ValidatorFn, ZodLike, null)
153
+ this.setValidator(path, config);
154
+ }
155
+ /**
156
+ * Set validator for a path
157
+ */
158
+ setValidator(path, validator, description) {
159
+ if (!validator) {
160
+ return;
161
+ }
162
+ if (typeof validator === 'function') {
163
+ this.validators.set(path, { type: 'validate', validate: validator, description });
164
+ }
165
+ else if (this.isZodLike(validator)) {
166
+ this.validators.set(path, { type: 'zod', zod: validator, description });
167
+ }
168
+ else if ('type' in validator) {
169
+ this.validators.set(path, { type: 'schema', schema: validator, description });
170
+ }
171
+ }
172
+ /** Parse path and extension */
173
+ parsePathExt(key) {
174
+ for (const [suffix, type] of Object.entries(Workspace.EXT_MAP)) {
175
+ if (key.endsWith(suffix)) {
176
+ return { path: key.slice(0, -suffix.length), ext: type };
177
+ }
178
+ }
179
+ return { path: key, ext: null };
180
+ }
181
+ /** Check if extension is a format type */
182
+ isFormatExt(ext) {
183
+ return ['json', 'md', 'txt', 'num', 'bool'].includes(ext);
184
+ }
185
+ /** Check if value looks like a Zod schema */
186
+ isZodLike(value) {
187
+ return (typeof value === 'object' &&
188
+ value !== null &&
189
+ 'safeParse' in value &&
190
+ typeof value.safeParse === 'function');
191
+ }
192
+ /**
193
+ * Write a value to the workspace at the given path
194
+ *
195
+ * @param path - Path (e.g., 'meals.today', 'user/preferences')
196
+ * @param value - Any JSON-serializable value
197
+ * @param _writtenBy - Optional identifier of who wrote this (unused, kept for API compatibility)
198
+ * @returns WriteResult with success status and any validation errors
199
+ */
200
+ write(path, value, _writtenBy) {
201
+ // Strict mode: only allow writing to defined paths
202
+ if (this.strict && !this.definedPaths.has(path)) {
203
+ return {
204
+ success: false,
205
+ errors: [{
206
+ path,
207
+ message: `Path "${path}" is not defined. Available paths: ${this.getDefinedPaths().join(', ') || 'none'}`
208
+ }]
209
+ };
210
+ }
211
+ const { ext } = this.parsePathExt(path);
212
+ const validator = this.validators.get(path);
213
+ let errors = [];
214
+ // Step 1: Format validation (from extension)
215
+ if (ext && this.isFormatExt(ext)) {
216
+ errors = this.validateFormat(value, ext, path);
217
+ if (errors.length > 0) {
218
+ return { success: false, errors };
219
+ }
220
+ }
221
+ // Step 2: Additional validation (from registered validator)
222
+ if (validator) {
223
+ if (validator.validate) {
224
+ const result = validator.validate(value);
225
+ if (result && result.length > 0) {
226
+ errors = result;
227
+ }
228
+ }
229
+ else if (validator.schema) {
230
+ errors = this.validateSchema(value, validator.schema, path);
231
+ }
232
+ else if (validator.zod) {
233
+ errors = this.validateZod(value, validator.zod, path);
234
+ }
235
+ }
236
+ if (errors.length > 0) {
237
+ return { success: false, errors };
238
+ }
239
+ // Normalize path to internal format (always stored with / prefix)
240
+ const fsPath = path.startsWith('/') ? path : `/${path}`;
241
+ // Serialize value for storage
242
+ const content = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
243
+ // Fire-and-forget write to provider
244
+ this.provider.write(fsPath, content).catch(() => { });
245
+ return { success: true };
246
+ }
247
+ /**
248
+ * Get validator info for a path
249
+ */
250
+ getValidator(path) {
251
+ const v = this.validators.get(path);
252
+ if (!v)
253
+ return undefined;
254
+ return { type: v.type, schema: v.schema, description: v.description };
255
+ }
256
+ /**
257
+ * Get schema for a path (if JSON schema validator)
258
+ */
259
+ getSchema(path) {
260
+ const v = this.validators.get(path);
261
+ return v?.schema;
262
+ }
263
+ /**
264
+ * Get validator description for a path
265
+ */
266
+ getValidatorDescription(path) {
267
+ return this.validators.get(path)?.description;
268
+ }
269
+ /**
270
+ * Get all paths with validators
271
+ */
272
+ getValidatorPaths() {
273
+ return Array.from(this.validators.keys());
274
+ }
275
+ /**
276
+ * Validate a value against a JSON schema
277
+ */
278
+ validateSchema(value, schema, basePath) {
279
+ const errors = [];
280
+ // Type check
281
+ if (schema.type === 'object') {
282
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
283
+ errors.push({
284
+ path: basePath,
285
+ message: 'Expected object',
286
+ expected: 'object',
287
+ received: value === null ? 'null' : Array.isArray(value) ? 'array' : typeof value
288
+ });
289
+ return errors;
290
+ }
291
+ const obj = value;
292
+ // Check required properties
293
+ if (schema.required) {
294
+ for (const prop of schema.required) {
295
+ if (!(prop in obj)) {
296
+ errors.push({
297
+ path: `${basePath}.${prop}`,
298
+ message: `Missing required property: ${prop}`,
299
+ expected: 'present'
300
+ });
301
+ }
302
+ }
303
+ }
304
+ // Validate properties
305
+ if (schema.properties) {
306
+ for (const [prop, propSchema] of Object.entries(schema.properties)) {
307
+ if (prop in obj) {
308
+ const propErrors = this.validateProperty(obj[prop], propSchema, `${basePath}.${prop}`);
309
+ errors.push(...propErrors);
310
+ }
311
+ }
312
+ }
313
+ }
314
+ return errors;
315
+ }
316
+ /**
317
+ * Validate a single property
318
+ */
319
+ validateProperty(value, schema, path) {
320
+ const errors = [];
321
+ // Type validation
322
+ if (schema.type === 'string') {
323
+ if (typeof value !== 'string') {
324
+ errors.push({
325
+ path,
326
+ message: 'Expected string',
327
+ expected: 'string',
328
+ received: typeof value
329
+ });
330
+ }
331
+ else if (schema.enum && !schema.enum.includes(value)) {
332
+ errors.push({
333
+ path,
334
+ message: `Value must be one of: ${schema.enum.join(', ')}`,
335
+ expected: schema.enum.join(' | '),
336
+ received: value
337
+ });
338
+ }
339
+ }
340
+ else if (schema.type === 'number') {
341
+ if (typeof value !== 'number') {
342
+ errors.push({
343
+ path,
344
+ message: 'Expected number',
345
+ expected: 'number',
346
+ received: typeof value
347
+ });
348
+ }
349
+ }
350
+ else if (schema.type === 'boolean') {
351
+ if (typeof value !== 'boolean') {
352
+ errors.push({
353
+ path,
354
+ message: 'Expected boolean',
355
+ expected: 'boolean',
356
+ received: typeof value
357
+ });
358
+ }
359
+ }
360
+ else if (schema.type === 'array') {
361
+ if (!Array.isArray(value)) {
362
+ errors.push({
363
+ path,
364
+ message: 'Expected array',
365
+ expected: 'array',
366
+ received: typeof value
367
+ });
368
+ }
369
+ }
370
+ else if (schema.type === 'object') {
371
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
372
+ errors.push({
373
+ path,
374
+ message: 'Expected object',
375
+ expected: 'object',
376
+ received: value === null ? 'null' : Array.isArray(value) ? 'array' : typeof value
377
+ });
378
+ }
379
+ }
380
+ return errors;
381
+ }
382
+ /**
383
+ * Validate a value using Zod schema
384
+ */
385
+ validateZod(value, zod, basePath) {
386
+ const result = zod.safeParse(value);
387
+ if (result.success) {
388
+ return [];
389
+ }
390
+ return result.error.errors.map(err => ({
391
+ path: err.path.length > 0 ? `${basePath}.${err.path.join('.')}` : basePath,
392
+ message: err.message
393
+ }));
394
+ }
395
+ /**
396
+ * Validate a value against a format extension
397
+ */
398
+ validateFormat(value, format, path) {
399
+ switch (format) {
400
+ case 'json':
401
+ if (typeof value !== 'object' || value === null) {
402
+ return [{
403
+ path,
404
+ message: 'Expected JSON object or array',
405
+ expected: 'object | array',
406
+ received: value === null ? 'null' : typeof value
407
+ }];
408
+ }
409
+ return [];
410
+ case 'md':
411
+ case 'txt':
412
+ if (typeof value !== 'string') {
413
+ return [{
414
+ path,
415
+ message: `Expected string for .${format}`,
416
+ expected: 'string',
417
+ received: typeof value
418
+ }];
419
+ }
420
+ return [];
421
+ case 'num':
422
+ if (typeof value !== 'number' || Number.isNaN(value)) {
423
+ return [{
424
+ path,
425
+ message: 'Expected number',
426
+ expected: 'number',
427
+ received: Number.isNaN(value) ? 'NaN' : typeof value
428
+ }];
429
+ }
430
+ return [];
431
+ case 'bool':
432
+ if (typeof value !== 'boolean') {
433
+ return [{
434
+ path,
435
+ message: 'Expected boolean',
436
+ expected: 'boolean',
437
+ received: typeof value
438
+ }];
439
+ }
440
+ return [];
441
+ default:
442
+ return [];
443
+ }
444
+ }
445
+ /**
446
+ * Read a value from the workspace
447
+ *
448
+ * @param path - Path to read from (with or without / prefix)
449
+ * @returns The value, or undefined if not found
450
+ */
451
+ async read(path) {
452
+ const fsPath = path.startsWith('/') ? path : `/${path}`;
453
+ const content = await this.provider.read(fsPath);
454
+ if (content === null)
455
+ return undefined;
456
+ try {
457
+ return JSON.parse(content);
458
+ }
459
+ catch {
460
+ return content;
461
+ }
462
+ }
463
+ /**
464
+ * Check if a path exists in the workspace
465
+ */
466
+ async has(path) {
467
+ const fsPath = path.startsWith('/') ? path : `/${path}`;
468
+ return this.provider.exists(fsPath);
469
+ }
470
+ /**
471
+ * Delete a path from the workspace
472
+ */
473
+ async delete(path) {
474
+ const fsPath = path.startsWith('/') ? path : `/${path}`;
475
+ return this.provider.delete(fsPath);
476
+ }
477
+ /**
478
+ * List all paths, optionally filtered by prefix
479
+ */
480
+ async list(prefix) {
481
+ const fsPrefix = prefix
482
+ ? (prefix.startsWith('/') ? prefix : `/${prefix}`)
483
+ : '/';
484
+ const files = await this.provider.glob(fsPrefix + '**/*');
485
+ const items = [];
486
+ for (const path of files) {
487
+ if (await this.provider.isDirectory(path))
488
+ continue;
489
+ const content = await this.provider.read(path);
490
+ let value = content;
491
+ try {
492
+ value = content ? JSON.parse(content) : null;
493
+ }
494
+ catch {
495
+ // Keep as string
496
+ }
497
+ items.push({
498
+ path,
499
+ updatedAt: Date.now(),
500
+ preview: this.getPreview(value)
501
+ });
502
+ }
503
+ return items.sort((a, b) => a.path.localeCompare(b.path));
504
+ }
505
+ /**
506
+ * Get all paths (just the keys, no metadata)
507
+ */
508
+ async keys(prefix) {
509
+ const fsPrefix = prefix
510
+ ? (prefix.startsWith('/') ? prefix : `/${prefix}`)
511
+ : '/';
512
+ const files = await this.provider.glob(fsPrefix + '**/*');
513
+ const result = [];
514
+ for (const p of files) {
515
+ if (!await this.provider.isDirectory(p)) {
516
+ result.push(p);
517
+ }
518
+ }
519
+ return result.sort();
520
+ }
521
+ /**
522
+ * Clear all data from the workspace
523
+ */
524
+ async clear() {
525
+ await this.provider.delete('/');
526
+ await this.provider.mkdir('/');
527
+ }
528
+ /**
529
+ * Get number of entries
530
+ */
531
+ async getSize() {
532
+ return (await this.keys()).length;
533
+ }
534
+ getPreview(value) {
535
+ if (value === null)
536
+ return 'null';
537
+ if (value === undefined)
538
+ return 'undefined';
539
+ const type = typeof value;
540
+ if (type === 'string') {
541
+ const str = value;
542
+ return str.length > 50 ? `"${str.slice(0, 47)}..."` : `"${str}"`;
543
+ }
544
+ if (type === 'number' || type === 'boolean') {
545
+ return String(value);
546
+ }
547
+ if (Array.isArray(value)) {
548
+ return `Array[${value.length}]`;
549
+ }
550
+ if (type === 'object') {
551
+ const keys = Object.keys(value);
552
+ if (keys.length <= 3) {
553
+ return `{${keys.join(', ')}}`;
554
+ }
555
+ return `{${keys.slice(0, 3).join(', ')}, ...+${keys.length - 3}}`;
556
+ }
557
+ return type;
558
+ }
559
+ }
560
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "tuplet",
3
+ "version": "2.7.0",
4
+ "description": "Tuplet — minimal TypeScript agent framework inspired by Claude Code architecture",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "keywords": [
18
+ "ai",
19
+ "agent",
20
+ "llm",
21
+ "claude",
22
+ "openai",
23
+ "tools",
24
+ "framework",
25
+ "tuplet"
26
+ ],
27
+ "author": "",
28
+ "license": "MIT",
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "dependencies": {
33
+ "@anthropic-ai/sdk": "^0.71.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^20.0.0",
37
+ "typescript": "^5.7.0",
38
+ "vitest": "^4.0.18"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc",
42
+ "dev": "tsc --watch",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "clean": "rm -rf dist"
46
+ }
47
+ }