@almadar/shell 2.16.1 → 2.16.4

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/.env.example +17 -0
  2. package/.gitignore +31 -0
  3. package/locales/en.json +120 -0
  4. package/package.json +31 -9
  5. package/packages/client/eslint.config.cjs +56 -0
  6. package/packages/client/index.html +13 -0
  7. package/packages/client/node_modules/.bin/autoprefixer +21 -0
  8. package/packages/client/node_modules/.bin/eslint +21 -0
  9. package/packages/client/node_modules/.bin/tailwind +21 -0
  10. package/packages/client/node_modules/.bin/tailwindcss +21 -0
  11. package/packages/client/node_modules/.bin/tsc +21 -0
  12. package/packages/client/node_modules/.bin/tsserver +21 -0
  13. package/packages/client/node_modules/.bin/vite +21 -0
  14. package/packages/client/node_modules/.bin/vitest +21 -0
  15. package/packages/client/package.json +63 -0
  16. package/packages/client/postcss.config.js +6 -0
  17. package/packages/client/src/App.tsx +81 -0
  18. package/packages/client/src/config/firebase.ts +37 -0
  19. package/packages/client/src/features/auth/AuthContext.tsx +139 -0
  20. package/packages/client/src/features/auth/authService.ts +83 -0
  21. package/packages/client/src/features/auth/components/Login.tsx +218 -0
  22. package/packages/client/src/features/auth/components/ProtectedRoute.tsx +27 -0
  23. package/packages/client/src/features/auth/components/UserProfile.tsx +68 -0
  24. package/packages/client/src/features/auth/components/index.ts +3 -0
  25. package/packages/client/src/features/auth/index.ts +13 -0
  26. package/packages/client/src/features/auth/types.ts +24 -0
  27. package/packages/client/src/generated/index.ts +13 -0
  28. package/packages/client/src/index.css +19 -0
  29. package/packages/client/src/main.tsx +8 -0
  30. package/packages/client/src/navigation/index.ts +55 -0
  31. package/packages/client/src/pages/index.ts +12 -0
  32. package/packages/client/tailwind-preset.cjs +259 -0
  33. package/packages/client/tailwind.config.js +31 -0
  34. package/packages/client/tsconfig.json +33 -0
  35. package/packages/client/vite.config.ts +50 -0
  36. package/packages/server/eslint.config.cjs +23 -0
  37. package/packages/server/node_modules/.bin/esbuild +21 -0
  38. package/packages/server/node_modules/.bin/eslint +21 -0
  39. package/packages/server/node_modules/.bin/tsc +21 -0
  40. package/packages/server/node_modules/.bin/tsserver +21 -0
  41. package/packages/server/node_modules/.bin/tsx +21 -0
  42. package/packages/server/node_modules/.bin/vitest +21 -0
  43. package/packages/server/package.json +42 -0
  44. package/packages/server/pnpm-lock.yaml +4723 -0
  45. package/packages/server/src/app.ts +41 -0
  46. package/packages/server/src/index.ts +30 -0
  47. package/packages/server/src/routes.ts +11 -0
  48. package/packages/server/src/types/express.d.ts +17 -0
  49. package/packages/server/tsconfig.json +23 -0
  50. package/packages/shared/package.json +11 -0
  51. package/packages/shared/pnpm-lock.yaml +22 -0
  52. package/packages/shared/src/index.ts +2 -0
  53. package/pnpm-workspace.yaml +2 -0
  54. package/turbo.json +17 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Navigation Module for Compiled Shells
3
+ *
4
+ * Re-exports schema-driven navigation from @almadar/ui/renderer.
5
+ * This module provides unified navigation that:
6
+ * - Finds pages by path pattern (supports :id params)
7
+ * - Switches active page via NavigationContext
8
+ * - Fires INIT events with merged payload (route params + explicit)
9
+ * - Optionally updates browser URL via history.pushState
10
+ *
11
+ * Usage in generated pages:
12
+ * ```tsx
13
+ * import { useNavigateTo, useInitPayload } from '../navigation';
14
+ *
15
+ * function InspectionsPage() {
16
+ * const navigateTo = useNavigateTo();
17
+ * const initPayload = useInitPayload();
18
+ *
19
+ * const handleRowClick = (item) => {
20
+ * navigateTo(`/inspection/${item.id}`, { id: item.id });
21
+ * };
22
+ *
23
+ * // Use initPayload for INIT event handling
24
+ * }
25
+ * ```
26
+ *
27
+ * @packageDocumentation
28
+ */
29
+
30
+ // Re-export all navigation utilities from @almadar/ui/renderer
31
+ export {
32
+ // Context and Provider
33
+ NavigationProvider,
34
+ useNavigation,
35
+ useNavigateTo,
36
+ useNavigationState,
37
+ useInitPayload,
38
+ useActivePage,
39
+ useNavigationId,
40
+ // Path utilities
41
+ matchPath,
42
+ extractRouteParams,
43
+ pathMatches,
44
+ // Page finding utilities
45
+ findPageByPath,
46
+ findPageByName,
47
+ getDefaultPage,
48
+ getAllPages,
49
+ } from '@almadar/ui/renderer';
50
+
51
+ export type {
52
+ NavigationState,
53
+ NavigationContextValue,
54
+ NavigationProviderProps,
55
+ } from '@almadar/ui/renderer';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Pages Placeholder
3
+ *
4
+ * This directory receives generated page components:
5
+ * - Route pages from OrbitalSchema
6
+ * - Layout components
7
+ *
8
+ * DO NOT EDIT - Contents are overwritten by compiler
9
+ */
10
+
11
+ // {{GENERATED_PAGE_EXPORTS}}
12
+ export {};
@@ -0,0 +1,259 @@
1
+ /**
2
+ * @almadar/ui Tailwind Preset
3
+ *
4
+ * Provides the complete Almadar design token system as a Tailwind preset.
5
+ * Includes a safelist for CSS-variable-based arbitrary classes that use
6
+ * bracket notation (Tailwind can't extract these from source scanning).
7
+ *
8
+ * Note: @almadar/ui dist content scanning is handled by tailwind.config.js
9
+ * in the shell template, not here. The config resolves the dist path via
10
+ * require.resolve('@almadar/ui') which works regardless of hoisting.
11
+ *
12
+ * Usage in tailwind.config.js:
13
+ * presets: [require('@almadar/ui/tailwind-preset')]
14
+ */
15
+
16
+ /** @type {import('tailwindcss').Config} */
17
+ module.exports = {
18
+ darkMode: 'class',
19
+ safelist: [
20
+ // Standard utilities used via dynamic className from .orb schemas
21
+ 'p-4', 'p-6', 'p-8',
22
+ 'px-4', 'px-6', 'py-4', 'py-6',
23
+ 'mx-auto',
24
+ 'w-full',
25
+ 'max-w-sm', 'max-w-md', 'max-w-lg', 'max-w-xl', 'max-w-2xl', 'max-w-3xl', 'max-w-4xl', 'max-w-5xl', 'max-w-6xl', 'max-w-7xl',
26
+ 'min-h-screen',
27
+ 'gap-1', 'gap-2', 'gap-3', 'gap-4', 'gap-6', 'gap-8',
28
+ 'grid-cols-1', 'grid-cols-2', 'grid-cols-3', 'grid-cols-4',
29
+ 'sm:grid-cols-2', 'md:grid-cols-2', 'md:grid-cols-3', 'lg:grid-cols-3', 'lg:grid-cols-4',
30
+ 'text-center', 'text-left', 'text-right',
31
+ // CSS variable-based classes from @almadar/ui components
32
+ 'accent-[var(--color-foreground)]',
33
+ 'accent-[var(--color-primary)]',
34
+ 'active:bg-[var(--color-muted)]',
35
+ 'active:bg-[var(--color-primary)]',
36
+ 'active:scale-[var(--active-scale)]',
37
+ 'active:shadow-[var(--shadow-active)]',
38
+ 'active:text-[var(--color-primary-foreground)]',
39
+ 'bg-[var(--color-accent)]',
40
+ 'bg-[var(--color-background)]',
41
+ 'bg-[var(--color-border)]',
42
+ 'bg-[var(--color-card)]',
43
+ 'bg-[var(--color-error)]',
44
+ 'bg-[var(--color-foreground)]',
45
+ 'bg-[var(--color-info)]',
46
+ 'bg-[var(--color-muted)]',
47
+ 'bg-[var(--color-muted-foreground)]',
48
+ ':bg-[var(--color-primary)]',
49
+ 'bg-[var(--color-primary)]',
50
+ 'bg-[var(--color-primary-foreground)]',
51
+ 'bg-[var(--color-secondary)]',
52
+ 'bg-[var(--color-success)]',
53
+ 'bg-[var(--color-surface)]',
54
+ 'bg-[var(--color-table-header)]',
55
+ 'bg-[var(--color-warning)]',
56
+ 'border-b-[length:var(--border-width)]',
57
+ 'border-b-[var(--color-foreground)]',
58
+ 'border-b-[var(--color-primary)]',
59
+ 'border-[length:var(--border-width)]',
60
+ 'border-[length:var(--border-width-thin)]',
61
+ 'border-l-[length:var(--border-width)]',
62
+ 'border-l-[var(--color-foreground)]',
63
+ 'border-l-[var(--color-primary)]',
64
+ 'border-r-[length:var(--border-width)]',
65
+ 'border-r-[var(--color-foreground)]',
66
+ 'border-r-[var(--color-primary)]',
67
+ 'border-t-[length:var(--border-width)]',
68
+ 'border-t-[var(--color-foreground)]',
69
+ 'border-t-[var(--color-primary)]',
70
+ 'border-[var(--color-accent)]',
71
+ ':border-[var(--color-border)]',
72
+ 'border-[var(--color-border)]',
73
+ 'border-[var(--color-card)]',
74
+ 'border-[var(--color-error)]',
75
+ 'border-[var(--color-foreground)]',
76
+ 'border-[var(--color-info)]',
77
+ ':border-[var(--color-primary)]',
78
+ 'border-[var(--color-primary)]',
79
+ 'border-[var(--color-success)]',
80
+ 'border-[var(--color-table-border)]',
81
+ 'border-[var(--color-warning)]',
82
+ 'border-x-[length:var(--border-width)]',
83
+ 'checked:bg-[var(--color-primary)]',
84
+ 'dark:bg-[var(--color-background)]',
85
+ 'dark:bg-[var(--color-card)]',
86
+ 'dark:bg-[var(--color-foreground)]',
87
+ 'dark:bg-[var(--color-muted)]',
88
+ 'dark:border-[var(--color-border)]',
89
+ 'dark:hover:bg-[var(--color-error)]',
90
+ 'dark:hover:bg-[var(--color-muted)]',
91
+ 'dark:text-[var(--color-error)]',
92
+ 'dark:text-[var(--color-foreground)]',
93
+ 'dark:text-[var(--color-muted-foreground)]',
94
+ 'disabled:bg-[var(--color-muted)]',
95
+ 'disabled:text-[var(--color-muted-foreground)]',
96
+ 'duration-[var(--transition-fast)]',
97
+ 'duration-[var(--transition-normal)]',
98
+ 'fill-[var(--color-warning)]',
99
+ 'focus:bg-[var(--color-card)]',
100
+ 'focus:bg-[var(--color-muted)]',
101
+ 'focus:border-[var(--color-error)]',
102
+ 'focus:border-[var(--color-primary)]',
103
+ 'focus:border-[var(--color-ring)]',
104
+ 'focus:ring-[length:var(--focus-ring-width)]',
105
+ 'focus:ring-offset-[length:var(--focus-ring-offset)]',
106
+ 'focus:ring-[var(--color-error)]',
107
+ 'focus:ring-[var(--color-ring)]',
108
+ 'font-[var(--font-weight-bold)]',
109
+ 'font-[var(--font-weight-medium)]',
110
+ 'from-[var(--color-muted)]',
111
+ 'group-hover:bg-[var(--color-foreground)]',
112
+ 'group-hover:text-[var(--color-foreground)]',
113
+ 'group-hover:text-[var(--color-muted-foreground)]',
114
+ 'hover:bg-[var(--color-error)]',
115
+ 'hover:bg-[var(--color-muted)]',
116
+ 'hover:bg-[var(--color-muted-foreground)]',
117
+ 'hover:bg-[var(--color-primary)]',
118
+ 'hover:bg-[var(--color-primary-hover)]',
119
+ 'hover:bg-[var(--color-secondary-hover)]',
120
+ 'hover:bg-[var(--color-success)]',
121
+ 'hover:bg-[var(--color-surface)]',
122
+ 'hover:bg-[var(--color-surface-hover)]',
123
+ 'hover:bg-[var(--color-table-row-hover)]',
124
+ 'hover:bg-[var(--color-warning)]',
125
+ 'hover:border-[var(--color-border)]',
126
+ 'hover:border-[var(--color-border-hover)]',
127
+ 'hover:border-[var(--color-muted-foreground)]',
128
+ 'hover:border-[var(--color-primary)]',
129
+ 'hover:ring-[var(--color-ring)]',
130
+ 'hover:shadow-[var(--shadow-hover)]',
131
+ 'hover:shadow-[var(--shadow-sm)]',
132
+ 'hover:text-[var(--color-error)]',
133
+ 'hover:text-[var(--color-error-foreground)]',
134
+ 'hover:text-[var(--color-foreground)]',
135
+ 'hover:text-[var(--color-primary)]',
136
+ 'hover:text-[var(--color-success-foreground)]',
137
+ 'hover:text-[var(--color-warning-foreground)]',
138
+ 'peer-focus:ring-[var(--color-error)]',
139
+ 'peer-focus:ring-[var(--color-ring)]',
140
+ 'placeholder:text-[var(--color-muted-foreground)]',
141
+ 'placeholder:text-[var(--color-placeholder)]',
142
+ 'ring-[var(--color-accent)]',
143
+ 'ring-[var(--color-error)]',
144
+ 'ring-[var(--color-info)]',
145
+ 'ring-[var(--color-muted-foreground)]',
146
+ 'ring-[var(--color-primary)]',
147
+ 'ring-[var(--color-success)]',
148
+ 'ring-[var(--color-warning)]',
149
+ 'rounded-l-[var(--radius-sm)]',
150
+ 'rounded-r-[var(--radius-sm)]',
151
+ 'rounded-t-[var(--radius-lg)]',
152
+ 'rounded-t-[var(--radius-sm)]',
153
+ 'rounded-[var(--radius-full)]',
154
+ 'rounded-[var(--radius-lg)]',
155
+ 'rounded-[var(--radius-md)]',
156
+ 'rounded-[var(--radius-sm)]',
157
+ 'rounded-[var(--radius-xl)]',
158
+ 'shadow-[var(--shadow-lg)]',
159
+ 'shadow-[var(--shadow-main)]',
160
+ 'shadow-[var(--shadow-sm)]',
161
+ 'text-[var(--color-accent)]',
162
+ 'text-[var(--color-accent-foreground)]',
163
+ 'text-[var(--color-background)]',
164
+ 'text-[var(--color-card-foreground)]',
165
+ 'text-[var(--color-error)]',
166
+ 'text-[var(--color-error-foreground)]',
167
+ 'text-[var(--color-foreground)]',
168
+ 'text-[var(--color-info)]',
169
+ 'text-[var(--color-info-foreground)]',
170
+ 'text-[var(--color-muted)]',
171
+ 'text-[var(--color-muted-foreground)]',
172
+ 'text-[var(--color-primary)]',
173
+ ':text-[var(--color-primary-foreground)]',
174
+ 'text-[var(--color-primary-foreground)]',
175
+ 'text-[var(--color-secondary-foreground)]',
176
+ 'text-[var(--color-success)]',
177
+ 'text-[var(--color-warning)]',
178
+ 'text-[var(--color-warning-foreground)]',
179
+ 'to-[var(--color-accent)]',
180
+ ],
181
+ theme: {
182
+ fontFamily: {
183
+ sans: ['var(--font-family)', 'ui-sans-serif', 'system-ui', 'sans-serif'],
184
+ mono: ['var(--font-family-mono, ui-monospace)', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'monospace'],
185
+ },
186
+ extend: {
187
+ colors: {
188
+ primary: {
189
+ DEFAULT: 'var(--color-primary)',
190
+ foreground: 'var(--color-primary-foreground)',
191
+ hover: 'var(--color-primary-hover)',
192
+ },
193
+ secondary: {
194
+ DEFAULT: 'var(--color-secondary)',
195
+ foreground: 'var(--color-secondary-foreground)',
196
+ hover: 'var(--color-secondary-hover)',
197
+ },
198
+ muted: {
199
+ DEFAULT: 'var(--color-muted)',
200
+ foreground: 'var(--color-muted-foreground)',
201
+ },
202
+ accent: {
203
+ DEFAULT: 'var(--color-accent)',
204
+ foreground: 'var(--color-accent-foreground)',
205
+ },
206
+ background: 'var(--color-background)',
207
+ foreground: 'var(--color-foreground)',
208
+ card: {
209
+ DEFAULT: 'var(--color-card)',
210
+ foreground: 'var(--color-card-foreground)',
211
+ },
212
+ surface: 'var(--color-surface)',
213
+ border: 'var(--color-border)',
214
+ input: 'var(--color-input)',
215
+ ring: 'var(--color-ring)',
216
+ error: {
217
+ DEFAULT: 'var(--color-error)',
218
+ foreground: 'var(--color-error-foreground)',
219
+ },
220
+ success: {
221
+ DEFAULT: 'var(--color-success)',
222
+ foreground: 'var(--color-success-foreground)',
223
+ },
224
+ warning: {
225
+ DEFAULT: 'var(--color-warning)',
226
+ foreground: 'var(--color-warning-foreground)',
227
+ },
228
+ info: {
229
+ DEFAULT: 'var(--color-info)',
230
+ foreground: 'var(--color-info-foreground)',
231
+ },
232
+ },
233
+ borderRadius: {
234
+ none: 'var(--radius-none, 0)',
235
+ sm: 'var(--radius-sm)',
236
+ md: 'var(--radius-md)',
237
+ lg: 'var(--radius-lg)',
238
+ xl: 'var(--radius-xl)',
239
+ full: 'var(--radius-full)',
240
+ },
241
+ boxShadow: {
242
+ sm: 'var(--shadow-sm)',
243
+ DEFAULT: 'var(--shadow-main)',
244
+ lg: 'var(--shadow-lg)',
245
+ inner: 'var(--shadow-inner)',
246
+ },
247
+ fontWeight: {
248
+ normal: 'var(--font-weight-normal, 400)',
249
+ medium: 'var(--font-weight-medium, 500)',
250
+ bold: 'var(--font-weight-bold, 600)',
251
+ },
252
+ transitionDuration: {
253
+ fast: 'var(--transition-fast, 150ms)',
254
+ normal: 'var(--transition-normal, 250ms)',
255
+ slow: 'var(--transition-slow, 400ms)',
256
+ },
257
+ },
258
+ },
259
+ };
@@ -0,0 +1,31 @@
1
+ import { createRequire } from 'module';
2
+ import { dirname, join } from 'path';
3
+ const require = createRequire(import.meta.url);
4
+
5
+ // Resolve @almadar/ui dist regardless of node_modules hoisting
6
+ const uiEntry = require.resolve('@almadar/ui');
7
+ const uiDist = join(dirname(uiEntry), '..', '**', '*.js');
8
+
9
+ // @almadar/ui's DashboardLayout (sidebar / topnav / bottomnav modes) and
10
+ // several molecules use container-query Tailwind variants (`@md/dashboard:flex`,
11
+ // `@sm/dashboard:block`, etc.). Without this plugin Tailwind silently drops
12
+ // every `@*/dashboard:*` class and the chrome renders as a blank top-bar with
13
+ // action icons collapsed to the left (no nav, no search, no app title).
14
+ const containerQueries = require('@tailwindcss/container-queries');
15
+
16
+ /** @type {import('tailwindcss').Config} */
17
+ export default {
18
+ // Single source of truth for Layer 1 + Layer 2 token mappings is
19
+ // @almadar/ui's published preset. Don't fork a local copy — it goes
20
+ // stale silently and breaks look variants without any build error.
21
+ presets: [require('@almadar/ui/tailwind-preset')],
22
+ content: [
23
+ "./index.html",
24
+ "./src/**/*.{js,ts,jsx,tsx}",
25
+ uiDist,
26
+ ],
27
+ theme: {
28
+ extend: {},
29
+ },
30
+ plugins: [containerQueries],
31
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
6
+ "types": ["vite/client"],
7
+ "module": "ESNext",
8
+ "skipLibCheck": true,
9
+ "moduleResolution": "bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "resolveJsonModule": true,
12
+ "isolatedModules": true,
13
+ "noEmit": true,
14
+ "jsx": "react-jsx",
15
+ "strict": true,
16
+ "noUnusedLocals": false,
17
+ "noUnusedParameters": false,
18
+ "noFallthroughCasesInSwitch": true,
19
+ "baseUrl": ".",
20
+ "paths": {
21
+ "@/*": ["./src/*"],
22
+ "@generated/*": ["./src/generated/*"],
23
+ "@pages/*": ["./src/pages/*"],
24
+ "@app/shared": ["../shared/src/index.ts"],
25
+ "@app/shared/*": ["../shared/src/*"],
26
+ "@shared/*": ["../shared/src/*"],
27
+ "@design-system": ["../../../design-system/index.ts"],
28
+ "@design-system/*": ["../../../design-system/*"]
29
+ }
30
+ },
31
+ "include": ["src", "../../../design-system/types"],
32
+ "exclude": ["node_modules", "dist", "src/**/__tests__", "src/**/*.stories.ts", "src/**/*.stories.tsx"]
33
+ }
@@ -0,0 +1,50 @@
1
+ import { defineConfig, loadEnv } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import path from 'path';
4
+
5
+ export default defineConfig(({ mode }) => {
6
+ const env = loadEnv(mode, process.cwd(), '');
7
+ const backendUrl = env.VITE_API_URL || 'http://localhost:3030';
8
+ const wsUrl = backendUrl.replace('http://', 'ws://').replace('https://', 'wss://');
9
+
10
+ return {
11
+ plugins: [react()],
12
+
13
+ resolve: {
14
+ alias: {
15
+ '@design-system': path.resolve(__dirname, '../../../design-system'),
16
+ '@': path.resolve(__dirname, './src'),
17
+ '@generated': path.resolve(__dirname, './src/generated'),
18
+ '@pages': path.resolve(__dirname, './src/pages'),
19
+ '@app/shared': path.resolve(__dirname, '../shared/src'),
20
+ '@shared': path.resolve(__dirname, '../shared/src'),
21
+ },
22
+ dedupe: ['react', 'react-dom', '@almadar/ui'],
23
+ },
24
+
25
+ server: {
26
+ host: true,
27
+ port: 5173,
28
+ proxy: {
29
+ '/api': {
30
+ target: backendUrl,
31
+ changeOrigin: true,
32
+ },
33
+ '/ws': {
34
+ target: wsUrl,
35
+ ws: true,
36
+ },
37
+ },
38
+ },
39
+
40
+ build: {
41
+ outDir: 'dist',
42
+ sourcemap: true,
43
+ },
44
+
45
+ test: {
46
+ environment: 'jsdom',
47
+ globals: true,
48
+ },
49
+ };
50
+ });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ const tsParser = require("@typescript-eslint/parser");
3
+ const almadarPlugin = require("@almadar/eslint-plugin");
4
+
5
+ module.exports = [
6
+ { ignores: ["dist/**", "node_modules/**", "**/*.test.ts"] },
7
+ {
8
+ files: ["src/**/*.ts"],
9
+ languageOptions: {
10
+ parser: tsParser,
11
+ parserOptions: { ecmaVersion: "latest", sourceType: "module" },
12
+ },
13
+ plugins: { almadar: almadarPlugin },
14
+ rules: {
15
+ // Zero escape hatches in emitted shell code — same rule set as client;
16
+ // see docs/Almadar_Compiler_Gaps.md for the per-rule codegen fix.
17
+ "almadar/no-as-any": "error",
18
+ "almadar/no-unknown-type": "error",
19
+ "almadar/no-record-string-unknown": "error",
20
+ "almadar/no-import-generated": "error",
21
+ },
22
+ },
23
+ ];
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/esbuild@0.25.12/node_modules/esbuild/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/esbuild@0.25.12/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/esbuild@0.25.12/node_modules/esbuild/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/esbuild@0.25.12/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../esbuild/bin/esbuild" "$@"
19
+ else
20
+ exec node "$basedir/../esbuild/bin/esbuild" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/eslint@10.0.0_jiti@1.21.7/node_modules/eslint/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/eslint@10.0.0_jiti@1.21.7/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/eslint@10.0.0_jiti@1.21.7/node_modules/eslint/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/eslint@10.0.0_jiti@1.21.7/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../eslint/bin/eslint.js" "$@"
19
+ else
20
+ exec node "$basedir/../eslint/bin/eslint.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsc" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../tsx/dist/cli.mjs" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/vitest@2.1.9_@types+node@20.19.37_jsdom@25.0.1/node_modules/vitest/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/vitest@2.1.9_@types+node@20.19.37_jsdom@25.0.1/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/vitest@2.1.9_@types+node@20.19.37_jsdom@25.0.1/node_modules/vitest/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/vitest@2.1.9_@types+node@20.19.37_jsdom@25.0.1/node_modules:/home/osamah/kflow.ai.builder/orbital-rust/packages/almadar-shell/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../vitest/vitest.mjs" "$@"
21
+ fi
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@almadar/shell-server",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "tsx watch src/index.ts",
8
+ "build": "esbuild src/index.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/index.js",
9
+ "start": "node dist/index.js",
10
+ "typecheck": "tsc --noEmit",
11
+ "lint": "eslint --max-warnings 0 src/",
12
+ "test": "vitest run --passWithNoTests",
13
+ "test:watch": "vitest"
14
+ },
15
+ "dependencies": {
16
+ "@almadar/core": "^7.14.3",
17
+ "@almadar/evaluator": "^2.12.1",
18
+ "@almadar/integrations": "^2.12.0",
19
+ "@almadar/logger": "^1.3.0",
20
+ "@almadar/runtime": "^6.9.3",
21
+ "@almadar/server": "^2.13.0",
22
+ "cors": "^2.8.5",
23
+ "dotenv": "^16.4.7",
24
+ "express": "^4.21.2",
25
+ "express-rate-limit": "^7.4.0",
26
+ "firebase-admin": "^12.7.0",
27
+ "helmet": "^8.0.0",
28
+ "zod": "^3.22.0"
29
+ },
30
+ "devDependencies": {
31
+ "@almadar/eslint-plugin": "^2.8.1",
32
+ "@types/cors": "^2.8.17",
33
+ "@types/express": "^5.0.0",
34
+ "@types/node": "^20.17.19",
35
+ "@typescript-eslint/parser": "8.56.0",
36
+ "esbuild": "^0.25.0",
37
+ "eslint": "10.0.0",
38
+ "tsx": "^4.19.3",
39
+ "typescript": "^5.7.3",
40
+ "vitest": "^2.1.9"
41
+ }
42
+ }