@rool-dev/cli 0.1.10-dev.930dc5c → 0.1.11-dev.0d43779

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 (54) hide show
  1. package/README.md +25 -12
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +34 -13
  4. package/dist/app.js.map +1 -1
  5. package/dist/chat.d.ts.map +1 -1
  6. package/dist/chat.js +14 -4
  7. package/dist/chat.js.map +1 -1
  8. package/dist/client.d.ts +2 -1
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +4 -2
  11. package/dist/client.js.map +1 -1
  12. package/dist/constants.d.ts +6 -1
  13. package/dist/constants.d.ts.map +1 -1
  14. package/dist/constants.js +10 -1
  15. package/dist/constants.js.map +1 -1
  16. package/dist/create.d.ts +3 -0
  17. package/dist/create.d.ts.map +1 -0
  18. package/dist/create.js +119 -0
  19. package/dist/create.js.map +1 -0
  20. package/dist/logout.d.ts.map +1 -1
  21. package/dist/logout.js +7 -4
  22. package/dist/logout.js.map +1 -1
  23. package/dist/media.d.ts.map +1 -1
  24. package/dist/media.js +14 -4
  25. package/dist/media.js.map +1 -1
  26. package/dist/program.d.ts.map +1 -1
  27. package/dist/program.js +11 -2
  28. package/dist/program.js.map +1 -1
  29. package/dist/space.d.ts.map +1 -1
  30. package/dist/space.js +29 -15
  31. package/dist/space.js.map +1 -1
  32. package/dist/user.d.ts.map +1 -1
  33. package/dist/user.js +7 -4
  34. package/dist/user.js.map +1 -1
  35. package/package.json +4 -3
  36. package/templates/svelte/AGENTS.md +57 -0
  37. package/templates/svelte/index.html +12 -0
  38. package/templates/svelte/package.json +25 -0
  39. package/templates/svelte/src/App.svelte +54 -0
  40. package/templates/svelte/src/Chat.svelte +92 -0
  41. package/templates/svelte/src/Header.svelte +26 -0
  42. package/templates/svelte/src/Objects.svelte +39 -0
  43. package/templates/svelte/src/Splash.svelte +21 -0
  44. package/templates/svelte/src/app.css +1 -0
  45. package/templates/svelte/src/main.ts +5 -0
  46. package/templates/svelte/tsconfig.json +13 -0
  47. package/templates/svelte/vite.config.ts +8 -0
  48. package/templates/vanilla/AGENTS.md +63 -0
  49. package/templates/vanilla/index.html +12 -0
  50. package/templates/vanilla/package.json +21 -0
  51. package/templates/vanilla/src/app.css +1 -0
  52. package/templates/vanilla/src/main.ts +158 -0
  53. package/templates/vanilla/tsconfig.json +10 -0
  54. package/templates/vanilla/vite.config.ts +7 -0
@@ -0,0 +1,158 @@
1
+ import { RoolClient, type RoolSpace } from '@rool-dev/sdk';
2
+ import './app.css';
3
+
4
+ const APP_NAME = 'Rool App';
5
+
6
+ const client = new RoolClient();
7
+ const app = document.getElementById('app')!;
8
+
9
+ let logEl: HTMLElement;
10
+ let inputEl: HTMLInputElement;
11
+ let buttonEl: HTMLButtonElement;
12
+
13
+ // --- Rendering ---
14
+
15
+ function renderSplash() {
16
+ app.innerHTML = `
17
+ <div class="min-h-dvh flex flex-col items-center justify-center bg-gray-50 p-8">
18
+ <div class="text-center max-w-sm">
19
+ <h1 class="text-3xl font-bold text-gray-900 mb-2">${APP_NAME}</h1>
20
+ <p class="text-gray-500 mb-8">Sign in to get started</p>
21
+ <button id="login-btn" class="px-6 py-3 bg-gray-900 hover:bg-gray-800 text-white font-medium rounded-lg">
22
+ Sign in
23
+ </button>
24
+ </div>
25
+ </div>
26
+ `;
27
+ document.getElementById('login-btn')!.onclick = () => client.login(APP_NAME);
28
+ }
29
+
30
+ function renderApp(space: RoolSpace) {
31
+ app.innerHTML = `
32
+ <div class="min-h-dvh flex flex-col bg-gray-900 text-gray-100 font-mono text-sm">
33
+ <header class="flex items-center justify-between px-4 py-2 border-b border-gray-700">
34
+ <span class="text-gray-400">${APP_NAME}</span>
35
+ <button id="logout-btn" class="text-gray-500 hover:text-gray-300">logout</button>
36
+ </header>
37
+ <div id="log" class="flex-1 overflow-y-auto p-4 space-y-1"></div>
38
+ <form id="prompt-form" class="border-t border-gray-700 p-4">
39
+ <div class="flex gap-2">
40
+ <span class="text-green-400">&gt;</span>
41
+ <input
42
+ type="text"
43
+ id="prompt-input"
44
+ placeholder="Type a prompt..."
45
+ class="flex-1 bg-transparent outline-none text-gray-100 placeholder-gray-600"
46
+ autocomplete="off"
47
+ />
48
+ <button type="submit" id="submit-btn" class="text-gray-500 hover:text-gray-300 disabled:opacity-50">
49
+ send
50
+ </button>
51
+ </div>
52
+ </form>
53
+ </div>
54
+ `;
55
+
56
+ logEl = document.getElementById('log')!;
57
+ inputEl = document.getElementById('prompt-input') as HTMLInputElement;
58
+ buttonEl = document.getElementById('submit-btn') as HTMLButtonElement;
59
+
60
+ document.getElementById('logout-btn')!.onclick = () => {
61
+ client.logout();
62
+ location.reload();
63
+ };
64
+
65
+ const form = document.getElementById('prompt-form') as HTMLFormElement;
66
+ form.onsubmit = async (e) => {
67
+ e.preventDefault();
68
+ const text = inputEl.value.trim();
69
+ if (!text) return;
70
+
71
+ log('prompt', text);
72
+ inputEl.value = '';
73
+ inputEl.disabled = true;
74
+ buttonEl.disabled = true;
75
+
76
+ try {
77
+ await space.checkpoint();
78
+ const { message } = await space.prompt(text);
79
+ log('response', message);
80
+ } catch (err) {
81
+ log('error', err instanceof Error ? err.message : String(err));
82
+ } finally {
83
+ inputEl.disabled = false;
84
+ buttonEl.disabled = false;
85
+ inputEl.focus();
86
+ }
87
+ };
88
+
89
+ // Subscribe to space events
90
+ space.on('objectCreated', ({ objectId, object }) => {
91
+ log('objectCreated', `${objectId}: ${JSON.stringify(object)}`);
92
+ });
93
+
94
+ space.on('objectUpdated', ({ objectId, object }) => {
95
+ log('objectUpdated', `${objectId}: ${JSON.stringify(object)}`);
96
+ });
97
+
98
+ space.on('objectDeleted', ({ objectId }) => {
99
+ log('objectDeleted', objectId);
100
+ });
101
+
102
+ space.on('linked', ({ sourceId, relation, targetId }) => {
103
+ log('linked', `${sourceId} --${relation}--> ${targetId}`);
104
+ });
105
+
106
+ space.on('unlinked', ({ sourceId, relation, targetId }) => {
107
+ log('unlinked', `${sourceId} --${relation}--> ${targetId}`);
108
+ });
109
+
110
+ log('info', `Connected to space "${space.name}"`);
111
+ log('info', 'Type a prompt to create or modify objects. Events will appear here.');
112
+ inputEl.focus();
113
+ }
114
+
115
+ function log(type: string, content: string) {
116
+ const line = document.createElement('div');
117
+ const colors: Record<string, string> = {
118
+ prompt: 'text-green-400',
119
+ response: 'text-blue-400',
120
+ info: 'text-gray-500',
121
+ error: 'text-red-400',
122
+ objectCreated: 'text-yellow-400',
123
+ objectUpdated: 'text-yellow-400',
124
+ objectDeleted: 'text-orange-400',
125
+ linked: 'text-purple-400',
126
+ unlinked: 'text-purple-400',
127
+ };
128
+ const color = colors[type] || 'text-gray-400';
129
+
130
+ line.innerHTML = `<span class="${color}">[${type}]</span> <span class="text-gray-300">${escapeHtml(content)}</span>`;
131
+ logEl.appendChild(line);
132
+ logEl.scrollTop = logEl.scrollHeight;
133
+ }
134
+
135
+ function escapeHtml(text: string): string {
136
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
137
+ }
138
+
139
+ // --- Main ---
140
+
141
+ async function main() {
142
+ const authenticated = await client.initialize();
143
+
144
+ if (!authenticated) {
145
+ renderSplash();
146
+ return;
147
+ }
148
+
149
+ // Find or create a space for this app
150
+ const spaces = await client.listSpaces();
151
+ const existing = spaces.find((s) => s.name === APP_NAME);
152
+
153
+ const space = existing ? await client.openSpace(existing.id) : await client.createSpace(APP_NAME);
154
+
155
+ renderApp(space);
156
+ }
157
+
158
+ main().catch(console.error);
@@ -0,0 +1,10 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "noEmit": true
8
+ },
9
+ "include": ["src/**/*"]
10
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'vite';
2
+ import tailwindcss from '@tailwindcss/vite';
3
+
4
+ export default defineConfig({
5
+ base: './',
6
+ plugins: [tailwindcss()],
7
+ });