@tuturuuu/utils 0.18.0 → 0.19.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.0](https://github.com/tutur3u/platform/compare/utils-v0.18.0...utils-v0.19.0) (2026-07-27)
4
+
5
+
6
+ ### Features
7
+
8
+ * **ai:** add workspace AI Studio and legal coverage ([6de4e39](https://github.com/tutur3u/platform/commit/6de4e395cc5568f4943604ac667e3cebf324be13))
9
+
3
10
  ## [0.18.0](https://github.com/tutur3u/platform/compare/utils-v0.17.0...utils-v0.18.0) (2026-07-25)
4
11
 
5
12
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tuturuuu/utils",
3
3
  "license": "MIT",
4
- "version": "0.18.0",
4
+ "version": "0.19.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/tutur3u/platform",
@@ -24,7 +24,7 @@
24
24
  "@tiptap/react": "3.28.0",
25
25
  "@tuturuuu/google": "0.1.0",
26
26
  "@tuturuuu/icons": "0.1.0",
27
- "@tuturuuu/internal-api": "0.21.0",
27
+ "@tuturuuu/internal-api": "0.23.0",
28
28
  "@tuturuuu/supabase": "0.5.0",
29
29
  "@upstash/ratelimit": "^2.0.8",
30
30
  "@upstash/redis": "^1.38.0",
@@ -45,7 +45,7 @@
45
45
  "zod": "^4.4.3"
46
46
  },
47
47
  "devDependencies": {
48
- "@tuturuuu/types": "0.20.0",
48
+ "@tuturuuu/types": "0.22.0",
49
49
  "@tuturuuu/typescript-config": "0.1.1",
50
50
  "@types/diff": "^8.0.0",
51
51
  "@types/node": "^26.1.1",
@@ -287,6 +287,7 @@ describe('Portless app origin registry', () => {
287
287
  '*.tuturuuu.localhost',
288
288
  ]);
289
289
  expect(Object.values(TUTURUUU_PORTLESS_APP_ORIGINS)).toEqual([
290
+ 'https://ai.tuturuuu.localhost',
290
291
  'https://apps.tuturuuu.localhost',
291
292
  'https://calendar.tuturuuu.localhost',
292
293
  'https://chat.tuturuuu.localhost',
@@ -326,7 +326,7 @@ describe('application metadata coverage', () => {
326
326
  )
327
327
  .map((entry) => resolve(entry.parentPath, entry.name));
328
328
 
329
- expect(marketingLayouts).toHaveLength(34);
329
+ expect(marketingLayouts).toHaveLength(37);
330
330
  for (const layoutPath of marketingLayouts) {
331
331
  expect(readFileSync(layoutPath, 'utf8')).toMatch(/pathname:\s*['`]/);
332
332
  }
@@ -4,6 +4,10 @@ import {
4
4
  } from './portless';
5
5
 
6
6
  export const PRODUCTION_INTERNAL_APP_DOMAINS = [
7
+ {
8
+ name: 'ai',
9
+ url: 'https://ai.tuturuuu.com',
10
+ },
7
11
  {
8
12
  name: 'apps',
9
13
  url: 'https://apps.tuturuuu.com',
@@ -123,6 +127,10 @@ export const PRODUCTION_INTERNAL_APP_DOMAINS = [
123
127
  ] as const;
124
128
 
125
129
  export const PORTLESS_INTERNAL_APP_DOMAINS = [
130
+ {
131
+ name: 'ai',
132
+ url: getTuturuuuPortlessAppOrigin('ai'),
133
+ },
126
134
  {
127
135
  name: 'apps',
128
136
  url: getTuturuuuPortlessAppOrigin('apps'),
@@ -234,6 +242,10 @@ export const PORTLESS_INTERNAL_APP_DOMAINS = [
234
242
  ] as const;
235
243
 
236
244
  export const LOCALHOST_INTERNAL_APP_DOMAINS = [
245
+ {
246
+ name: 'ai',
247
+ url: 'http://localhost:7829',
248
+ },
237
249
  {
238
250
  name: 'apps',
239
251
  url: 'http://localhost:7818',
@@ -237,6 +237,19 @@ export const LAUNCHABLE_APPS = [
237
237
  title: 'Mind',
238
238
  workspacePathResolver: workspaceRootPath,
239
239
  },
240
+ {
241
+ aliases: ['AI Studio', 'API', 'Models', 'Agents', 'Evaluations'],
242
+ appRoot: 'apps/ai',
243
+ category: 'ai',
244
+ defaultPath: '/playground',
245
+ localhostOrigin: 'http://localhost:7829',
246
+ packageName: '@tuturuuu/ai-studio',
247
+ portlessApp: 'ai',
248
+ productionUrl: 'https://ai.tuturuuu.com',
249
+ slug: 'ai',
250
+ title: 'AI Studio',
251
+ workspacePathResolver: workspaceRootPath,
252
+ },
240
253
  {
241
254
  aliases: ['Prompt', 'Challenges'],
242
255
  appRoot: 'apps/nova',
@@ -315,6 +315,70 @@ export const permissionGroups = ({
315
315
  disableOnProduction: false,
316
316
  disabled: false,
317
317
  },
318
+ {
319
+ id: 'use_ai_studio',
320
+ icon: <Sparkles />,
321
+ title: t('ws-roles.use_ai_studio'),
322
+ description: t('ws-roles.use_ai_studio_description'),
323
+ disableOnProduction: false,
324
+ disabled: false,
325
+ },
326
+ {
327
+ id: 'manage_ai_keys',
328
+ icon: <KeyRound />,
329
+ title: t('ws-roles.manage_ai_keys'),
330
+ description: t('ws-roles.manage_ai_keys_description'),
331
+ disableOnProduction: false,
332
+ disabled: false,
333
+ },
334
+ {
335
+ id: 'manage_ai_policy',
336
+ icon: <Settings2 />,
337
+ title: t('ws-roles.manage_ai_policy'),
338
+ description: t('ws-roles.manage_ai_policy_description'),
339
+ disableOnProduction: false,
340
+ disabled: false,
341
+ },
342
+ {
343
+ id: 'manage_ai_prompts',
344
+ icon: <FileText />,
345
+ title: t('ws-roles.manage_ai_prompts'),
346
+ description: t('ws-roles.manage_ai_prompts_description'),
347
+ disableOnProduction: false,
348
+ disabled: false,
349
+ },
350
+ {
351
+ id: 'manage_ai_agents',
352
+ icon: <CircuitBoard />,
353
+ title: t('ws-roles.manage_ai_agents'),
354
+ description: t('ws-roles.manage_ai_agents_description'),
355
+ disableOnProduction: false,
356
+ disabled: false,
357
+ },
358
+ {
359
+ id: 'manage_ai_evaluations',
360
+ icon: <FlaskConical />,
361
+ title: t('ws-roles.manage_ai_evaluations'),
362
+ description: t('ws-roles.manage_ai_evaluations_description'),
363
+ disableOnProduction: false,
364
+ disabled: false,
365
+ },
366
+ {
367
+ id: 'view_ai_usage',
368
+ icon: <ChartBar />,
369
+ title: t('ws-roles.view_ai_usage'),
370
+ description: t('ws-roles.view_ai_usage_description'),
371
+ disableOnProduction: false,
372
+ disabled: false,
373
+ },
374
+ {
375
+ id: 'view_ai_logs',
376
+ icon: <ScrollText />,
377
+ title: t('ws-roles.view_ai_logs'),
378
+ description: t('ws-roles.view_ai_logs_description'),
379
+ disableOnProduction: false,
380
+ disabled: false,
381
+ },
318
382
  ],
319
383
  },
320
384
  {
@@ -7,7 +7,7 @@ import {
7
7
 
8
8
  describe('platform release metadata', () => {
9
9
  it('uses the centralized shared browser app version', () => {
10
- expect(TUTURUUU_PLATFORM_VERSION).toBe('0.26.0'); // x-release-please-version
10
+ expect(TUTURUUU_PLATFORM_VERSION).toBe('0.28.0'); // x-release-please-version
11
11
  });
12
12
 
13
13
  it('preserves the source timestamp in builtAt and derives a short hash', () => {
@@ -1,6 +1,6 @@
1
1
  import { PLATFORM_BUILD_METADATA } from './generated/platform-build-metadata';
2
2
 
3
- export const TUTURUUU_PLATFORM_VERSION = '0.26.0'; // x-release-please-version
3
+ export const TUTURUUU_PLATFORM_VERSION = '0.28.0'; // x-release-please-version
4
4
 
5
5
  export type PlatformBuildMetadataInput = {
6
6
  /** ISO timestamp of the source commit used for the build, not deployment time. */
package/src/portless.ts CHANGED
@@ -6,6 +6,7 @@ export const TUTURUUU_PORTLESS_ALLOWED_DEV_ORIGINS = [
6
6
  ] as const;
7
7
 
8
8
  export const TUTURUUU_PORTLESS_APP_ORIGINS = {
9
+ ai: `https://ai.${TUTURUUU_PORTLESS_ROOT_HOST}`,
9
10
  apps: `https://apps.${TUTURUUU_PORTLESS_ROOT_HOST}`,
10
11
  calendar: `https://calendar.${TUTURUUU_PORTLESS_ROOT_HOST}`,
11
12
  chat: `https://chat.${TUTURUUU_PORTLESS_ROOT_HOST}`,