@notis_ai/cli 0.2.6 → 0.2.8

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 (151) hide show
  1. package/README.md +17 -0
  2. package/dist/scaffolds/notis-database/app/page.tsx +38 -41
  3. package/dist/scaffolds/notis-database/lib/types.ts +5 -7
  4. package/dist/scaffolds/notis-database/metadata/screenshot-1.png +0 -0
  5. package/dist/scaffolds/notis-database/metadata/screenshot-2.png +0 -0
  6. package/dist/scaffolds/notis-database/metadata/screenshot-3.png +0 -0
  7. package/dist/scaffolds/notis-database/metadata/screenshot-4.png +0 -0
  8. package/dist/scaffolds/notis-database/metadata/screenshot-5.png +0 -0
  9. package/dist/scaffolds/notis-database/metadata/screenshot-fixtures.json +1839 -0
  10. package/dist/scaffolds/notis-database/notis.config.ts +48 -1
  11. package/dist/scaffolds/notis-database/package-lock.json +3935 -0
  12. package/dist/scaffolds/notis-database/package.json +2 -1
  13. package/dist/scaffolds/notis-database/packages/sdk/package.json +36 -0
  14. package/dist/scaffolds/notis-database/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  15. package/dist/scaffolds/notis-database/packages/sdk/src/components/Markdown.tsx +60 -0
  16. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
  17. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  18. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  19. package/dist/scaffolds/notis-database/packages/sdk/src/config.ts +196 -0
  20. package/dist/scaffolds/notis-database/packages/sdk/src/documents.ts +229 -0
  21. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useBackend.ts +41 -0
  22. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  23. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocument.ts +78 -0
  24. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocuments.ts +121 -0
  25. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
  26. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotis.ts +34 -0
  27. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  28. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTool.ts +64 -0
  29. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTools.ts +56 -0
  30. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  31. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  32. package/dist/scaffolds/notis-database/packages/sdk/src/index.ts +83 -0
  33. package/dist/scaffolds/notis-database/packages/sdk/src/provider.tsx +43 -0
  34. package/dist/scaffolds/notis-database/packages/sdk/src/runtime.ts +220 -0
  35. package/dist/scaffolds/notis-database/packages/sdk/src/styles.css +186 -0
  36. package/dist/scaffolds/notis-database/packages/sdk/src/ui.ts +15 -0
  37. package/dist/scaffolds/notis-database/packages/sdk/src/vite.ts +56 -0
  38. package/dist/scaffolds/notis-database/packages/sdk/tsconfig.json +15 -0
  39. package/dist/scaffolds/notis-database/src/mock-runtime.ts +4 -1
  40. package/dist/scaffolds/notis-journal/CHANGELOG.md +4 -0
  41. package/dist/scaffolds/notis-journal/app/page.tsx +1 -0
  42. package/dist/scaffolds/notis-journal/package-lock.json +4615 -0
  43. package/dist/scaffolds/notis-journal/package.json +2 -2
  44. package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +52 -1
  45. package/dist/scaffolds/notis-notes/app/page.tsx +39 -46
  46. package/dist/scaffolds/notis-notes/app/phosphor-icons.ts +596 -0
  47. package/dist/scaffolds/notis-notes/lib/visible-properties.ts +144 -0
  48. package/dist/scaffolds/notis-notes/metadata/screenshot-1.png +0 -0
  49. package/dist/scaffolds/notis-notes/metadata/screenshot-2.png +0 -0
  50. package/dist/scaffolds/notis-notes/metadata/screenshot-3.png +0 -0
  51. package/dist/scaffolds/notis-notes/metadata/screenshot-4.png +0 -0
  52. package/dist/scaffolds/notis-notes/metadata/screenshot-5.png +0 -0
  53. package/dist/scaffolds/notis-notes/metadata/screenshot-fixtures.json +752 -0
  54. package/dist/scaffolds/notis-notes/notis.config.ts +48 -3
  55. package/dist/scaffolds/notis-notes/package-lock.json +4636 -0
  56. package/dist/scaffolds/notis-notes/package.json +7 -3
  57. package/dist/scaffolds/notis-notes/packages/sdk/package.json +36 -0
  58. package/dist/scaffolds/notis-notes/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  59. package/dist/scaffolds/notis-notes/packages/sdk/src/components/Markdown.tsx +60 -0
  60. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
  61. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  62. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  63. package/dist/scaffolds/notis-notes/packages/sdk/src/config.ts +196 -0
  64. package/dist/scaffolds/notis-notes/packages/sdk/src/documents.ts +229 -0
  65. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useBackend.ts +41 -0
  66. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  67. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocument.ts +78 -0
  68. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocuments.ts +121 -0
  69. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
  70. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotis.ts +34 -0
  71. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  72. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTool.ts +64 -0
  73. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTools.ts +56 -0
  74. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  75. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  76. package/dist/scaffolds/notis-notes/packages/sdk/src/index.ts +83 -0
  77. package/dist/scaffolds/notis-notes/packages/sdk/src/provider.tsx +43 -0
  78. package/dist/scaffolds/notis-notes/packages/sdk/src/runtime.ts +220 -0
  79. package/dist/scaffolds/notis-notes/packages/sdk/src/styles.css +186 -0
  80. package/dist/scaffolds/notis-notes/packages/sdk/src/ui.ts +15 -0
  81. package/dist/scaffolds/notis-notes/packages/sdk/src/vite.ts +56 -0
  82. package/dist/scaffolds/notis-notes/packages/sdk/tsconfig.json +15 -0
  83. package/dist/scaffolds/notis-random/CHANGELOG.md +12 -2
  84. package/dist/scaffolds/notis-random/app/history/page.tsx +5 -4
  85. package/dist/scaffolds/notis-random/app/page.tsx +141 -74
  86. package/dist/scaffolds/notis-random/components/ui/button.tsx +50 -0
  87. package/dist/scaffolds/notis-random/components/ui/card.tsx +16 -0
  88. package/dist/scaffolds/notis-random/components/ui/input.tsx +23 -0
  89. package/dist/scaffolds/notis-random/components.json +20 -0
  90. package/dist/scaffolds/notis-random/lib/notis-tools.ts +26 -7
  91. package/dist/scaffolds/notis-random/lib/rng.ts +179 -19
  92. package/dist/scaffolds/notis-random/lib/roll-record.ts +103 -16
  93. package/dist/scaffolds/notis-random/metadata/screenshot-1.png +0 -0
  94. package/dist/scaffolds/notis-random/metadata/screenshot-2.png +0 -0
  95. package/dist/scaffolds/notis-random/metadata/screenshot-3.png +0 -0
  96. package/dist/scaffolds/notis-random/metadata/screenshot-4.png +0 -0
  97. package/dist/scaffolds/notis-random/metadata/screenshot-5.png +0 -0
  98. package/dist/scaffolds/notis-random/metadata/screenshot-fixtures.json +753 -0
  99. package/dist/scaffolds/notis-random/notis.config.ts +47 -3
  100. package/dist/scaffolds/notis-random/package-lock.json +4513 -0
  101. package/dist/scaffolds/notis-random/package.json +6 -2
  102. package/dist/scaffolds/notis-random/packages/sdk/package.json +36 -0
  103. package/dist/scaffolds/notis-random/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  104. package/dist/scaffolds/notis-random/packages/sdk/src/components/Markdown.tsx +60 -0
  105. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
  106. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  107. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  108. package/dist/scaffolds/notis-random/packages/sdk/src/config.ts +196 -0
  109. package/dist/scaffolds/notis-random/packages/sdk/src/documents.ts +229 -0
  110. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useBackend.ts +41 -0
  111. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  112. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocument.ts +78 -0
  113. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocuments.ts +121 -0
  114. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
  115. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotis.ts +34 -0
  116. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  117. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTool.ts +64 -0
  118. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTools.ts +56 -0
  119. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  120. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  121. package/dist/scaffolds/notis-random/packages/sdk/src/index.ts +83 -0
  122. package/dist/scaffolds/notis-random/packages/sdk/src/provider.tsx +43 -0
  123. package/dist/scaffolds/notis-random/packages/sdk/src/runtime.ts +220 -0
  124. package/dist/scaffolds/notis-random/packages/sdk/src/styles.css +186 -0
  125. package/dist/scaffolds/notis-random/packages/sdk/src/ui.ts +15 -0
  126. package/dist/scaffolds/notis-random/packages/sdk/src/vite.ts +56 -0
  127. package/dist/scaffolds/notis-random/packages/sdk/tsconfig.json +15 -0
  128. package/dist/scaffolds/notis-random/tailwind.config.ts +8 -1
  129. package/dist/scaffolds.json +8 -6
  130. package/package.json +2 -1
  131. package/skills/notis-apps/SKILL.md +449 -144
  132. package/skills/notis-apps/cli.md +15 -0
  133. package/skills/notis-cli/SKILL.md +8 -4
  134. package/skills/notis-onboarding/BRIEF.md +93 -0
  135. package/src/cli.js +52 -7
  136. package/src/command-specs/apps.js +154 -21
  137. package/src/command-specs/diagnostics.js +674 -0
  138. package/src/command-specs/helpers.js +4 -1
  139. package/src/command-specs/index.js +8 -0
  140. package/src/command-specs/onboarding.js +216 -0
  141. package/src/command-specs/smoke.js +386 -0
  142. package/src/command-specs/tools.js +189 -5
  143. package/src/runtime/app-platform.js +65 -4
  144. package/src/runtime/desktop-auth.js +66 -17
  145. package/src/runtime/errors.js +1 -0
  146. package/src/runtime/output.js +21 -3
  147. package/src/runtime/profiles.js +214 -18
  148. package/src/runtime/telemetry.js +92 -0
  149. package/src/runtime/transport.js +29 -1
  150. package/template/.harness/index.html.tmpl +30 -2
  151. package/template/packages/sdk/src/config.ts +38 -1
package/README.md CHANGED
@@ -200,6 +200,21 @@ Examples:
200
200
  - `npx --package @notis_ai/cli@latest -- notis apps publish --confirm-ready`
201
201
  - `npx --package @notis_ai/cli@latest -- notis apps publish ./my-app --confirm-ready`
202
202
 
203
+ ### `npx --package @notis_ai/cli@latest -- notis apps duplicate [dir]`
204
+
205
+ Duplicate an app into an independent copy with its own databases.
206
+
207
+ When to use: When the same app should run for a second purpose - a notes app for blog drafts alongside one for bookmarks. The copy shares no data with the source.
208
+
209
+ Options:
210
+ - `--app-id <id>` — App to duplicate. Defaults to the app this project is linked to.
211
+ - `--name <name>` — Name for the duplicate (default: the source name followed by "copy").
212
+ - `--copy-documents <mode>` — Which rows to copy: 'declared' (default, the starter content a fresh install would have), 'all', or 'none'.
213
+
214
+ Examples:
215
+ - `npx --package @notis_ai/cli@latest -- notis apps duplicate --name "Blog"`
216
+ - `npx --package @notis_ai/cli@latest -- notis apps duplicate --app-id abc123 --name "Bookmarks" --copy-documents none`
217
+
203
218
  ### `npx --package @notis_ai/cli@latest -- notis apps doctor [dir]`
204
219
 
205
220
  Check project health and readiness.
@@ -254,6 +269,7 @@ When to use: Use this as the escape hatch for integrations or Notis tools withou
254
269
 
255
270
  Options:
256
271
  - `--arguments <json>` — JSON object, @file path, or - for stdin.
272
+ - `--arguments-file <path>` — Read the JSON arguments object from a file.
257
273
  - `--file <argument-path=local-path>` — Upload a local file into a file-uploadable tool argument. Repeatable.
258
274
  - `--get-schema` — Display the tool parameter schema without executing.
259
275
  - `--dry-run` — Validate arguments against the tool schema without executing.
@@ -264,6 +280,7 @@ Examples:
264
280
  - `npx --package @notis_ai/cli@latest -- notis tools exec LOCAL_NOTIS_DATABASE_QUERY --get-schema`
265
281
  - `npx --package @notis_ai/cli@latest -- notis tools exec LOCAL_NOTIS_DATABASE_QUERY --dry-run --arguments '{"database_slug":"tasks","query":{}}'`
266
282
  - `npx --package @notis_ai/cli@latest -- notis tools exec LOCAL_NOTIS_DATABASE_QUERY --arguments @query.json`
283
+ - `npx --package @notis_ai/cli@latest -- notis tools exec LOCAL_NOTIS_DATABASE_QUERY --arguments-file query.json`
267
284
  - `npx --package @notis_ai/cli@latest -- notis tools exec LOCAL_NOTIS_DATABASE_QUERY --arguments - < query.json`
268
285
  - `npx --package @notis_ai/cli@latest -- notis tools exec composio-dropbox-upload_file --arguments '{"path":"/target/in/dropbox.pdf"}' --file content=./Invoice.pdf`
269
286
 
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
- import { useTool, useTopBarSearch } from '@notis/sdk';
4
+ import { normalizeDocumentRecord, useTool, useTopBarSearch } from '@notis/sdk';
5
5
  import { WarningCircleIcon as AlertCircle, AtIcon as AtSign, CalendarIcon as Calendar, CheckSquareIcon as CheckSquare, CaretDownIcon as ChevronDown, CircleIcon as Circle, CircleIcon as CircleDot, DatabaseIcon as Database, FileTextIcon as FileText, HashIcon as Hash, LinkIcon as Link2, ListChecksIcon as ListChecks, CircleNotchIcon as Loader2, EnvelopeIcon as Mail, PaperclipIcon as Paperclip, PhoneIcon as Phone, SigmaIcon as Sigma, TagIcon as Tag, TextTIcon as Type, UserIcon as User } from '@phosphor-icons/react';
6
6
 
7
7
  import { Badge } from '@/components/ui/badge';
@@ -326,10 +326,10 @@ export default function CatalogPage() {
326
326
  if (activeTab !== 'documents') return;
327
327
  if (!detail) return;
328
328
 
329
- const databaseSlug = detail.slug;
330
- if (!databaseSlug) {
329
+ const databaseId = detail.id;
330
+ if (!databaseId) {
331
331
  setDocuments([]);
332
- setDocumentsError('This database does not have a queryable slug.');
332
+ setDocumentsError('This database does not have a stable ID.');
333
333
  setDocumentsLoading(false);
334
334
  return;
335
335
  }
@@ -347,7 +347,7 @@ export default function CatalogPage() {
347
347
 
348
348
  for (let page = 0; page < maxPages; page += 1) {
349
349
  const result = await queryCall({
350
- database_slug: databaseSlug,
350
+ database_id: databaseId,
351
351
  query: { page_size: pageSize },
352
352
  offset,
353
353
  });
@@ -357,7 +357,10 @@ export default function CatalogPage() {
357
357
  throw new Error(result?.message || 'Failed to load documents.');
358
358
  }
359
359
 
360
- collected = [...collected, ...(result.documents ?? [])];
360
+ collected = [
361
+ ...collected,
362
+ ...(result.documents ?? []).map((document) => normalizeDocumentRecord(document)),
363
+ ];
361
364
  setDocuments(collected);
362
365
 
363
366
  if (!result.has_more) return;
@@ -411,7 +414,10 @@ export default function CatalogPage() {
411
414
  const propCount = nonRelationProps(detail).length;
412
415
 
413
416
  return (
414
- <div className="flex h-screen w-full overflow-hidden bg-background text-foreground antialiased">
417
+ <div
418
+ data-store-screenshot="catalog"
419
+ className="flex h-screen w-full overflow-hidden bg-background text-foreground antialiased"
420
+ >
415
421
  <aside className="flex h-full w-[288px] flex-shrink-0 flex-col border-r border-border bg-background">
416
422
  <div className="flex items-baseline justify-between gap-2 px-4 pb-3 pt-4">
417
423
  <h1 className="text-lg font-semibold tracking-tight">Databases</h1>
@@ -691,6 +697,7 @@ function DetailHeader({
691
697
  label="Properties"
692
698
  count={propCount}
693
699
  active={activeTab === 'properties'}
700
+ tab="properties"
694
701
  onClick={() => onTabChange('properties')}
695
702
  />
696
703
  <TabButton
@@ -698,6 +705,7 @@ function DetailHeader({
698
705
  label="Relations"
699
706
  count={relCount}
700
707
  active={activeTab === 'relations'}
708
+ tab="relations"
701
709
  onClick={() => onTabChange('relations')}
702
710
  />
703
711
  <TabButton
@@ -705,6 +713,7 @@ function DetailHeader({
705
713
  label="Documents"
706
714
  count={docCount}
707
715
  active={activeTab === 'documents'}
716
+ tab="documents"
708
717
  onClick={() => onTabChange('documents')}
709
718
  />
710
719
  </div>
@@ -717,17 +726,20 @@ function TabButton({
717
726
  label,
718
727
  count,
719
728
  active,
729
+ tab,
720
730
  onClick,
721
731
  }: {
722
732
  icon: React.ReactNode;
723
733
  label: string;
724
734
  count: number;
725
735
  active: boolean;
736
+ tab: ActiveTab;
726
737
  onClick: () => void;
727
738
  }) {
728
739
  return (
729
740
  <button
730
741
  type="button"
742
+ data-tab={tab}
731
743
  onClick={onClick}
732
744
  className={cn(
733
745
  'flex items-center gap-1.5 px-3.5 py-1.5 text-[12.5px] transition-colors',
@@ -953,10 +965,10 @@ function DocumentsTable({
953
965
  </div>
954
966
  </TableCell>
955
967
  <TableCell className="whitespace-nowrap text-muted-foreground">
956
- {formatDateTime(document.created_time)}
968
+ {formatDateTime(document.createdAt)}
957
969
  </TableCell>
958
970
  <TableCell className="whitespace-nowrap text-muted-foreground">
959
- {formatDateTime(document.last_edited_time)}
971
+ {formatDateTime(document.lastEditedTime)}
960
972
  </TableCell>
961
973
  {properties.map((property) => {
962
974
  const propertyName = property.name ?? property.id;
@@ -994,43 +1006,36 @@ function PropertyValue({
994
1006
  property: DatabaseProperty;
995
1007
  value: DocumentPropertyValue | undefined;
996
1008
  }) {
997
- if (!value) return <MutedDash />;
1009
+ if (value == null || value === '') return <MutedDash />;
998
1010
 
999
1011
  switch (property.type) {
1000
1012
  case 'title':
1001
- return <TextValue value={textFromRichText(value.title)} />;
1002
1013
  case 'rich_text':
1003
- return <TextValue value={textFromRichText(value.rich_text)} />;
1014
+ return <TextValue value={typeof value === 'string' ? value : stringifyFallback(value)} />;
1004
1015
  case 'number':
1005
- return <TextValue value={typeof value.number === 'number' ? compactNumber(value.number) : ''} />;
1016
+ return <TextValue value={typeof value === 'number' ? compactNumber(value) : ''} />;
1006
1017
  case 'select':
1007
- case 'status': {
1008
- const selected = value[property.type];
1009
- if (!selected || typeof selected !== 'object') return <MutedDash />;
1010
- const option = selected as { name?: string | null; color?: string | null };
1011
- if (!option.name) return <MutedDash />;
1018
+ case 'status':
1019
+ if (typeof value !== 'string') return <MutedDash />;
1012
1020
  return (
1013
- <Badge variant="secondary" className={cn('rounded-sm px-1.5 py-px', selectTint(option.color))}>
1014
- {option.name}
1021
+ <Badge variant="secondary" className="rounded-sm px-1.5 py-px">
1022
+ {value}
1015
1023
  </Badge>
1016
1024
  );
1017
- }
1018
1025
  case 'multi_select': {
1019
- const options = Array.isArray(value.multi_select) ? value.multi_select : [];
1026
+ const options = Array.isArray(value) ? value : [];
1020
1027
  if (options.length === 0) return <MutedDash />;
1021
1028
  return (
1022
1029
  <div className="flex max-w-[240px] flex-wrap gap-1">
1023
1030
  {options.map((option, index) => {
1024
- const item = option && typeof option === 'object'
1025
- ? option as { id?: string | null; name?: string | null; color?: string | null }
1026
- : null;
1031
+ const label = typeof option === 'string' ? option : stringifyFallback(option);
1027
1032
  return (
1028
1033
  <Badge
1029
- key={item?.id ?? item?.name ?? index}
1034
+ key={`${label}-${index}`}
1030
1035
  variant="secondary"
1031
- className={cn('rounded-sm px-1.5 py-px', selectTint(item?.color))}
1036
+ className="rounded-sm px-1.5 py-px"
1032
1037
  >
1033
- {item?.name ?? 'Untitled'}
1038
+ {label || 'Untitled'}
1034
1039
  </Badge>
1035
1040
  );
1036
1041
  })}
@@ -1038,25 +1043,17 @@ function PropertyValue({
1038
1043
  );
1039
1044
  }
1040
1045
  case 'checkbox':
1041
- return <TextValue value={value.checkbox ? 'Yes' : 'No'} />;
1042
- case 'date': {
1043
- const date = value.date;
1044
- if (!date || typeof date !== 'object') return <MutedDash />;
1045
- const range = date as { start?: string | null; end?: string | null };
1046
- const start = formatDate(range.start);
1047
- const end = range.end ? formatDate(range.end) : null;
1048
- return <TextValue value={end ? `${start} – ${end}` : start} />;
1049
- }
1046
+ return <TextValue value={value === true ? 'Yes' : 'No'} />;
1047
+ case 'date':
1048
+ return <TextValue value={typeof value === 'string' ? formatDate(value) : ''} />;
1050
1049
  case 'url':
1051
1050
  case 'email':
1052
1051
  case 'phone_number':
1053
- return <TextValue value={typeof value[property.type] === 'string' ? value[property.type] as string : ''} />;
1052
+ return <TextValue value={typeof value === 'string' ? value : ''} />;
1054
1053
  case 'relation':
1055
- return <TextValue value={relationLabel(value.relation, 'linked record')} />;
1056
1054
  case 'people':
1057
- return <TextValue value={relationLabel(value.people, 'person')} />;
1058
1055
  case 'files':
1059
- return <TextValue value={relationLabel(value.files, 'file')} />;
1056
+ return <TextValue value={relationLabel(value, property.type === 'people' ? 'person' : property.type === 'files' ? 'file' : 'linked record')} />;
1060
1057
  default:
1061
1058
  return <TextValue value={stringifyFallback(value)} />;
1062
1059
  }
@@ -25,7 +25,8 @@ export type GetDatabaseArgs = {
25
25
  };
26
26
 
27
27
  export type QueryDatabaseArgs = {
28
- database_slug: string;
28
+ database_id?: string;
29
+ database_slug?: string;
29
30
  query: {
30
31
  page_size?: number;
31
32
  };
@@ -105,10 +106,7 @@ export type GetDatabaseResult =
105
106
  | { database: DatabaseDetail }
106
107
  | { status: 'error'; message: string };
107
108
 
108
- export type DocumentPropertyValue = {
109
- type?: string;
110
- [key: string]: unknown;
111
- };
109
+ export type DocumentPropertyValue = unknown;
112
110
 
113
111
  export type DatabaseDocument = {
114
112
  id: string;
@@ -116,8 +114,8 @@ export type DatabaseDocument = {
116
114
  properties?: Record<string, DocumentPropertyValue>;
117
115
  property_states?: Record<string, string>;
118
116
  url?: string | null;
119
- created_time?: string | null;
120
- last_edited_time?: string | null;
117
+ createdAt?: string | null;
118
+ lastEditedTime?: string | null;
121
119
  icon?: string | null;
122
120
  cover?: string | null;
123
121
  };