@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.
- package/README.md +25 -12
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +34 -13
- package/dist/app.js.map +1 -1
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +14 -4
- package/dist/chat.js.map +1 -1
- package/dist/client.d.ts +2 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -2
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +6 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -1
- package/dist/constants.js.map +1 -1
- package/dist/create.d.ts +3 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +119 -0
- package/dist/create.js.map +1 -0
- package/dist/logout.d.ts.map +1 -1
- package/dist/logout.js +7 -4
- package/dist/logout.js.map +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +14 -4
- package/dist/media.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +11 -2
- package/dist/program.js.map +1 -1
- package/dist/space.d.ts.map +1 -1
- package/dist/space.js +29 -15
- package/dist/space.js.map +1 -1
- package/dist/user.d.ts.map +1 -1
- package/dist/user.js +7 -4
- package/dist/user.js.map +1 -1
- package/package.json +4 -3
- package/templates/svelte/AGENTS.md +57 -0
- package/templates/svelte/index.html +12 -0
- package/templates/svelte/package.json +25 -0
- package/templates/svelte/src/App.svelte +54 -0
- package/templates/svelte/src/Chat.svelte +92 -0
- package/templates/svelte/src/Header.svelte +26 -0
- package/templates/svelte/src/Objects.svelte +39 -0
- package/templates/svelte/src/Splash.svelte +21 -0
- package/templates/svelte/src/app.css +1 -0
- package/templates/svelte/src/main.ts +5 -0
- package/templates/svelte/tsconfig.json +13 -0
- package/templates/svelte/vite.config.ts +8 -0
- package/templates/vanilla/AGENTS.md +63 -0
- package/templates/vanilla/index.html +12 -0
- package/templates/vanilla/package.json +21 -0
- package/templates/vanilla/src/app.css +1 -0
- package/templates/vanilla/src/main.ts +158 -0
- package/templates/vanilla/tsconfig.json +10 -0
- 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">></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, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
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);
|