needle-cloud 2.4.5 → 2.4.6

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/dist/cli.esm.js CHANGED
@@ -1 +1 @@
1
- import"node-fetch";import"@web-std/file";import"node:crypto";export{p as program}from"./cli-5251dd32.js";import"fs";import"dotenv";import"ora";import"commander";import"open";import"crypto";import"buffer";import"path";import"node:fs";import"node:fs/promises";import"node:os";import"node:path";import"util";import"stream";import"http";import"https";import"url";import"assert";import"tty";import"os";import"zlib";import"events";import"node:readline/promises";import"@logto/node";import"node:readline";import"node:stream";import"node:zlib";import"express";import"ws";import"child_process";import"minimatch";import"body-parser";import"node:child_process";
1
+ import"node-fetch";import"@web-std/file";import"node:crypto";export{p as program}from"./cli-619611b8.js";import"fs";import"dotenv";import"ora";import"commander";import"open";import"crypto";import"buffer";import"path";import"node:fs";import"node:fs/promises";import"node:os";import"node:path";import"util";import"stream";import"http";import"https";import"url";import"net";import"tls";import"assert";import"tty";import"os";import"events";import"http2";import"zlib";import"node:readline/promises";import"@logto/node";import"node:readline";import"node:stream";import"node:zlib";import"express";import"ws";import"child_process";import"minimatch";import"body-parser";import"node:child_process";
@@ -0,0 +1 @@
1
+ import{existsSync as t,readdirSync as o,statSync as r}from"node:fs";import{dirname as i,join as e}from"node:path";import{g as n}from"./cli-619611b8.js";import"node-fetch";import"@web-std/file";import"node:crypto";import"commander";import"fs";import"open";import"crypto";import"buffer";import"path";import"ora";import"node:fs/promises";import"node:os";import"util";import"stream";import"http";import"https";import"url";import"net";import"tls";import"assert";import"tty";import"os";import"events";import"http2";import"zlib";import"node:readline/promises";import"dotenv";import"@logto/node";import"node:readline";import"node:stream";import"node:zlib";import"express";import"ws";import"child_process";import"minimatch";import"body-parser";import"node:child_process";function p(){var p;let m;try{m=n()}catch{return null}const s=null==(p=m)||null==(p=p.entries)?void 0:p[0];if(!s)return null;if(!s.log_location)return null;if("unity"!==s.editor&&"blender"!==s.editor)return null;if(!t(s.log_location))return null;const l=s.log_location,c=function(t,i){const n=new Set([i]);try{for(const i of o(t)){if(!i.toLowerCase().endsWith(".log"))continue;const o=e(t,i);try{if(!r(o).isFile())continue}catch{continue}n.add(o)}}catch{}return[...n]}(i(l),l);return{editor:s.editor,path:l,paths:c}}export{p as findActiveEditorLog};
package/dist/index.d.ts CHANGED
@@ -90,6 +90,10 @@ declare namespace Auth {
90
90
  * Request an access token for the configured resource
91
91
  * @param {string | undefined | null} [org_id] - The organization ID (optional). If none is provided the user access token will be requested.
92
92
  * @returns {Promise<string>}
93
+ *
94
+ * Deduplicated per org: every caller that needs a token used to ask
95
+ * independently, so one page load fired eight identical requests. Concurrent
96
+ * callers now share one; see _requestAccessToken.
93
97
  */
94
98
  function requestAccessToken(org_id?: string | undefined | null): Promise<string>;
95
99
  /**
@@ -170,26 +174,65 @@ type RecentChatsResponse$1 = {
170
174
  }
171
175
 
172
176
 
173
- /** Context block sent by the client (e.g. page metadata, scene hierarchy). */
174
- type ClientContext = {
175
- type: "text",
176
- text: string,
177
+ /**
178
+ * How much of an image the model is asked to look at. `low` costs a fraction of
179
+ * `high` and answers most of what a picture is sent for ("is the object in
180
+ * frame?", "is the scene dark?"); choose `high` when it has to read text in the
181
+ * image. Defaults to `low`.
182
+ */
183
+ type ImageDetail = "high" | "low"
184
+
185
+ /** An image sent to the model. `url` is an http(s) url or a `data:image/...` url. */
186
+ type ClientImage = {
187
+ type: "image",
188
+ url: string,
189
+ detail?: ImageDetail,
177
190
  }
178
191
 
192
+ /** Context block sent by the client (e.g. page metadata, scene hierarchy, a screenshot). */
193
+ type ClientContext =
194
+ | { type: "text", text: string }
195
+ | ClientImage
196
+
179
197
 
180
198
  type ChatMessageToolCall = {
181
199
  name: string,
200
+ /** Server-provided pretty label for the tool, when the tool author set one
201
+ * (streamed on the tool_call event). The UI prefers this over title-casing
202
+ * the raw `name`. */
203
+ display_name?: string | null,
182
204
  args: Record<string, any>,
183
205
  result_length?: number,
184
206
  duration_ms?: number,
185
207
  }
186
208
 
209
+ /**
210
+ * An image belonging to a chat message — a screenshot the AI took, a render.
211
+ *
212
+ * `url` is a stable, token-signed route on the API (not a presigned storage
213
+ * url): it can be rendered directly, it does not expire between page loads, and
214
+ * it stops resolving as soon as the chat is deleted.
215
+ */
216
+ type ChatMessageAttachment = {
217
+ kind: "image",
218
+ url: string,
219
+ mime?: string,
220
+ width?: number,
221
+ height?: number,
222
+ /** How much of it the model was asked to look at. */
223
+ detail?: ImageDetail,
224
+ /** What produced it, e.g. the name of the tool that returned it. */
225
+ source?: string,
226
+ }
227
+
187
228
  type ChatMessage = {
188
229
  created_at: string,
189
230
  id: string,
190
231
  role: "assistant" | "tool" | "user",
191
232
  content: string,
192
233
  tool_calls?: ChatMessageToolCall[],
234
+ /** Images belonging to this message. Absent on the vast majority of messages. */
235
+ attachments?: ChatMessageAttachment[],
193
236
  metadata?: {
194
237
  tokens?: { input: number, output: number },
195
238
  model?: string,
@@ -274,11 +317,18 @@ type ChatStreamEvent = { /** SSE event id for position tracking. */ id?: number
274
317
  /** Server-assigned message ID for the AI response. */
275
318
  | { type: "message_id", message_id: string }
276
319
  /** The AI invoked a tool. Use for UI indicators (e.g. "Running get_screenshot..."). */
277
- | { type: "tool_call", name: string, args: Record<string, any> }
320
+ | { type: "tool_call", name: string, display_name?: string | null, args: Record<string, any> }
278
321
  /** A tool finished executing. The AI will continue generating with the result. */
279
322
  | { type: "tool_result", name: string }
280
323
  /** An error occurred. Display `message` to the user. */
281
324
  | { type: "error", message: string }
325
+ /**
326
+ * A non-fatal problem the USER should see, rendered as its own line rather
327
+ * than folded into the answer. First case: a step whose model cannot view
328
+ * images, so the picture was left out of the request instead of failing the
329
+ * whole turn.
330
+ */
331
+ | { type: "notice", message: string }
282
332
  /** Generation was interrupted by the user (via `interruptChat()`). */
283
333
  | { type: "stopped" }
284
334
  /** Informational status update (e.g. "Searching documentation..."). */
@@ -337,6 +387,36 @@ type ToolDefinition$1 = {
337
387
  inputSchema: Record<string, any>,
338
388
  }
339
389
 
390
+ /**
391
+ * Which chat a tool request came from, passed to `onToolRequest`.
392
+ *
393
+ * One tool connection serves every chat you have open, so a client running more
394
+ * than one conversation needs this to attach the result to the right one.
395
+ */
396
+ type ToolRequestMeta = {
397
+ /** The chat this request belongs to; `null` if the server did not identify one. */
398
+ chatId: string | null,
399
+ /** Id of this request, matching the result sent back for it. */
400
+ requestId: string,
401
+ }
402
+
403
+ /**
404
+ * What a tool hands back.
405
+ *
406
+ * `images` is the way to return a PICTURE — a screenshot, a render, a chart —
407
+ * instead of describing it. They reach the model as image parts on a following
408
+ * user turn (a tool message itself can only carry text), so the model sees them
409
+ * rather than being handed a base64 string it cannot read.
410
+ *
411
+ * Keep them few and small: an image is a payload, and `detail: "low"` is both
412
+ * the default and usually enough.
413
+ */
414
+ type ToolRequestOutcome = {
415
+ result?: any,
416
+ error?: string,
417
+ images?: Array<{ url: string, detail?: ImageDetail }>,
418
+ }
419
+
340
420
 
341
421
  // ─── ChatSession Types ──────────────────────────────────────────────
342
422
 
@@ -357,8 +437,9 @@ type ChatSessionOptions$1 = {
357
437
  * Called when the server requests tool execution.
358
438
  * Return `{ result: ... }` on success or `{ error: "..." }` on failure.
359
439
  * Required if `tools` is non-empty.
440
+ * `meta.chatId` says which chat asked — a session can drive several.
360
441
  */
361
- onToolRequest?: (name: string, args: Record<string, any>) => Promise<{ result?: any, error?: string }>,
442
+ onToolRequest?: (name: string, args: Record<string, any>, meta: ToolRequestMeta) => Promise<ToolRequestOutcome>,
362
443
  /**
363
444
  * How long (ms) to wait for the WebSocket to connect and register tools
364
445
  * before `ready` rejects. Defaults to 5000. Set to 0 to skip WS entirely.
@@ -1204,6 +1285,13 @@ type ContentListItem = {
1204
1285
  content_type: ContentType | null;
1205
1286
  /** Available content formats for this content item (e.g. ["glb", "textures"]) */
1206
1287
  content_formats: ContentFormat[];
1288
+ /** Page for editing this item in the cloud UI. Present for everything the
1289
+ * caller can see through this endpoint, since it is already scoped to their
1290
+ * org. Null only when the server has no configured frontend origin. */
1291
+ edit_url?: string | null;
1292
+ /** Standalone viewer page. Null for deployments (they ARE a website — use
1293
+ * `url`) and for items with no artifact to view yet. */
1294
+ view_url?: string | null;
1207
1295
  /** Number of top-level versions (matches the versions[] array in the detail response) */
1208
1296
  version_count: number;
1209
1297
  /** Whether the content is password-protected (requires commercial license) */
@@ -1403,6 +1491,323 @@ declare function getContent(identifier: string, opts?: {
1403
1491
  authToken?: string;
1404
1492
  }): Promise<GetContentDetailResponse>;
1405
1493
 
1494
+ /**
1495
+ * @internal Needle editor cloud projects — versioned revisions of OPAQUE
1496
+ * project documents (needle-cloud plans/cloud-projects-api.md). Editor-only,
1497
+ * NO stability guarantee, deliberately not in the public OpenAPI docs.
1498
+ *
1499
+ * The server never parses a document: it stores blobs plus a revision graph.
1500
+ * These types ARE the wire contract the editor's IProjectRemote adapter
1501
+ * aligns to.
1502
+ */
1503
+
1504
+ /** derived server-side from timestamps; deleted outranks archived.
1505
+ * "deleted" lists the BIN (bounded to the restore window). */
1506
+ type ProjectState = "active" | "archived" | "deleted";
1507
+
1508
+ interface ProjectInfo {
1509
+ /** public project handle (projects.identifier) */
1510
+ id: string;
1511
+ name: string;
1512
+ /** product discriminator, e.g. "web-project" (the editor) — opaque to the server */
1513
+ kind?: string;
1514
+ created_at?: string | null;
1515
+ updated_at?: string | null;
1516
+ /** set = the project is ARCHIVED (read-only; pushes return 409) */
1517
+ archived_at?: string | null;
1518
+ /** set = the project is in the BIN (only on ?state=deleted listings) */
1519
+ deleted_at?: string | null;
1520
+ /** user-editable metadata — opaque to the server */
1521
+ description?: string | null;
1522
+ tags?: string[] | null;
1523
+ /** newest revision's actor id — null for a project with no pushes */
1524
+ updated_by?: string | null;
1525
+ /** resolved display name of updated_by (cached lookup) — null when unresolvable */
1526
+ updated_by_name?: string | null;
1527
+ }
1528
+
1529
+ interface ProjectRevisionInfo {
1530
+ /** resolved display name of the actor (server-side cached Logto lookup);
1531
+ * null when unresolvable — the actor ID stays the stored truth.
1532
+ * Present on the revisions LISTING only. */
1533
+ actorName?: string | null;
1534
+ /** 1-based, strictly increasing per project */
1535
+ revision: number;
1536
+ /** the revision this push was built on (0 for the first) */
1537
+ baseRevision: number;
1538
+ /** sha-256 hex of the full document bytes */
1539
+ hash: string;
1540
+ /** token identity of the pusher — never client-supplied */
1541
+ actor: string;
1542
+ /** ISO timestamp */
1543
+ timestamp: string | null;
1544
+ }
1545
+
1546
+ interface CreateProjectResponse {
1547
+ id: string;
1548
+ name: string;
1549
+ kind?: string;
1550
+ }
1551
+
1552
+ interface ListProjectsResponse {
1553
+ projects: ProjectInfo[];
1554
+ }
1555
+
1556
+ /** PARTIAL update: absent = keep, null = clear */
1557
+ interface UpdateProjectRequest {
1558
+ name?: string;
1559
+ description?: string | null;
1560
+ /** max 20 tags, 1-64 characters each (deduped server-side) */
1561
+ tags?: string[] | null;
1562
+ }
1563
+
1564
+ interface UpdateProjectResponse {
1565
+ id: string;
1566
+ name: string;
1567
+ description: string | null;
1568
+ tags: string[] | null;
1569
+ }
1570
+
1571
+ interface CloneProjectResponse {
1572
+ /** the COPY's public handle */
1573
+ id: string;
1574
+ name: string;
1575
+ kind?: string;
1576
+ /** the source project's handle */
1577
+ sourceId: string;
1578
+ }
1579
+
1580
+ interface ProjectHeadResponse {
1581
+ head: ProjectRevisionInfo | null;
1582
+ }
1583
+
1584
+ interface PushProjectRequest {
1585
+ /** project id (public handle) */
1586
+ project: string;
1587
+ /** optimistic-concurrency token: the revision the client built on */
1588
+ baseRevision: number;
1589
+ /** sha-256 hex of the decoded bytes — verified server-side */
1590
+ hash: string;
1591
+ /** base64 document bytes */
1592
+ bytes: string;
1593
+ }
1594
+
1595
+ interface PushProjectResponse {
1596
+ /** ok = revision minted; unchanged = identical to head, nothing minted;
1597
+ * stale = head moved past the base — pull, merge client-side, retry */
1598
+ status: "ok" | "unchanged" | "stale";
1599
+ head: ProjectRevisionInfo;
1600
+ }
1601
+
1602
+ interface PullProjectResponse {
1603
+ info: ProjectRevisionInfo;
1604
+ /** base64 document bytes */
1605
+ bytes: string;
1606
+ }
1607
+
1608
+ /**
1609
+ * @internal Needle editor cloud projects — versioned revisions of OPAQUE
1610
+ * project documents. Editor-only, NO stability guarantee (needle-cloud
1611
+ * plans/cloud-projects-api.md): the document format is young and this
1612
+ * surface changes with it. The server never parses a document.
1613
+ *
1614
+ * Auth mirrors {@link listContent}: browser session unless an explicit
1615
+ * `authToken` is passed (the Needle editor's identity service does).
1616
+ */
1617
+ /**
1618
+ * @internal
1619
+ * @param {string} name
1620
+ * @param {{ org?: string, authToken?: string, kind: string }} opts - kind = product discriminator, REQUIRED (editor: "web-project")
1621
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").CreateProjectResponse>}
1622
+ */
1623
+ declare function createProject(name: string, opts: {
1624
+ org?: string;
1625
+ authToken?: string;
1626
+ kind: string;
1627
+ }): Promise<CreateProjectResponse>;
1628
+ /**
1629
+ * @internal
1630
+ * @param {{ org?: string, authToken?: string, kind?: string, state?: import("@needle-tools/cloud-sdk/types/api.projects").ProjectState }} [opts] - kind filters to one product's projects; state = "active" (default) | "archived" | "deleted" (the bin)
1631
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").ListProjectsResponse>}
1632
+ */
1633
+ declare function listProjects(opts?: {
1634
+ org?: string;
1635
+ authToken?: string;
1636
+ kind?: string;
1637
+ state?: ProjectState;
1638
+ }): Promise<ListProjectsResponse>;
1639
+ /**
1640
+ * @internal
1641
+ * @param {string} project - project id (public handle)
1642
+ * @param {{ org?: string, authToken?: string }} [opts]
1643
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").ProjectHeadResponse>}
1644
+ */
1645
+ declare function getProjectHead(project: string, opts?: {
1646
+ org?: string;
1647
+ authToken?: string;
1648
+ }): Promise<ProjectHeadResponse>;
1649
+ /**
1650
+ * @internal
1651
+ * @param {import("@needle-tools/cloud-sdk/types/api.projects").PushProjectRequest} request
1652
+ * @param {{ org?: string, authToken?: string }} [opts]
1653
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").PushProjectResponse>}
1654
+ */
1655
+ declare function pushProjectRevision(request: PushProjectRequest, opts?: {
1656
+ org?: string;
1657
+ authToken?: string;
1658
+ }): Promise<PushProjectResponse>;
1659
+ /**
1660
+ * @internal Resolves to null when the project or revision does not exist —
1661
+ * callers (the editor's project remote) treat that as "nothing to pull",
1662
+ * not an error.
1663
+ * @param {string} project - project id (public handle)
1664
+ * @param {number} [revision] - specific revision; head when omitted
1665
+ * @param {{ org?: string, authToken?: string }} [opts]
1666
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").PullProjectResponse | null>}
1667
+ */
1668
+ declare function pullProjectRevision(project: string, revision?: number, opts?: {
1669
+ org?: string;
1670
+ authToken?: string;
1671
+ }): Promise<PullProjectResponse | null>;
1672
+ /**
1673
+ * @internal SOFT delete — history and blobs are preserved server-side.
1674
+ * @param {string} project - project id (public handle)
1675
+ * @param {{ org?: string, authToken?: string }} [opts]
1676
+ * @returns {Promise<{id: string, message: string}>}
1677
+ */
1678
+ declare function deleteProject(project: string, opts?: {
1679
+ org?: string;
1680
+ authToken?: string;
1681
+ }): Promise<{
1682
+ id: string;
1683
+ message: string;
1684
+ }>;
1685
+ /**
1686
+ * @internal Un-delete a project from the bin (bounded server-side to the bin window).
1687
+ * @param {string} project - project id (public handle)
1688
+ * @param {{ org?: string, authToken?: string }} [opts]
1689
+ * @returns {Promise<{id: string, message: string}>}
1690
+ */
1691
+ declare function restoreProject(project: string, opts?: {
1692
+ org?: string;
1693
+ authToken?: string;
1694
+ }): Promise<{
1695
+ id: string;
1696
+ message: string;
1697
+ }>;
1698
+ /**
1699
+ * @internal Archive = read-only + hidden from the default list; pushes return 409.
1700
+ * @param {string} project - project id (public handle)
1701
+ * @param {{ org?: string, authToken?: string }} [opts]
1702
+ * @returns {Promise<{id: string, message: string}>}
1703
+ */
1704
+ declare function archiveProject(project: string, opts?: {
1705
+ org?: string;
1706
+ authToken?: string;
1707
+ }): Promise<{
1708
+ id: string;
1709
+ message: string;
1710
+ }>;
1711
+ /**
1712
+ * @internal
1713
+ * @param {string} project - project id (public handle)
1714
+ * @param {{ org?: string, authToken?: string }} [opts]
1715
+ * @returns {Promise<{id: string, message: string}>}
1716
+ */
1717
+ declare function unarchiveProject(project: string, opts?: {
1718
+ org?: string;
1719
+ authToken?: string;
1720
+ }): Promise<{
1721
+ id: string;
1722
+ message: string;
1723
+ }>;
1724
+ /**
1725
+ * @internal Duplicate a project inside its org — zero-copy server-side.
1726
+ * @param {string} project - source project id (public handle)
1727
+ * @param {{ org?: string, authToken?: string, name?: string }} [opts] - the copy's name; "<source> (copy)" when omitted
1728
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").CloneProjectResponse>}
1729
+ */
1730
+ declare function cloneProject(project: string, opts?: {
1731
+ org?: string;
1732
+ authToken?: string;
1733
+ name?: string;
1734
+ }): Promise<CloneProjectResponse>;
1735
+ /**
1736
+ * @internal PARTIAL metadata update — absent fields stay, null clears.
1737
+ * @param {string} project - project id (public handle)
1738
+ * @param {import("@needle-tools/cloud-sdk/types/api.projects").UpdateProjectRequest} patch
1739
+ * @param {{ org?: string, authToken?: string }} [opts]
1740
+ * @returns {Promise<import("@needle-tools/cloud-sdk/types/api.projects").UpdateProjectResponse>}
1741
+ */
1742
+ declare function updateProject(project: string, patch: UpdateProjectRequest, opts?: {
1743
+ org?: string;
1744
+ authToken?: string;
1745
+ }): Promise<UpdateProjectResponse>;
1746
+ /**
1747
+ * @internal Which of these file-blob hashes the org pool does not hold yet.
1748
+ * @param {readonly string[]} hashes
1749
+ * @param {{ org?: string, authToken?: string }} [opts]
1750
+ * @returns {Promise<{ missing: string[] }>}
1751
+ */
1752
+ declare function checkProjectBlobs(hashes: readonly string[], opts?: {
1753
+ org?: string;
1754
+ authToken?: string;
1755
+ }): Promise<{
1756
+ missing: string[];
1757
+ }>;
1758
+ /**
1759
+ * @internal Presigned PUT url for one file blob.
1760
+ * @param {string} hash
1761
+ * @param {number} size
1762
+ * @param {{ org?: string, authToken?: string }} [opts]
1763
+ * @returns {Promise<{ url: string, key: string }>}
1764
+ */
1765
+ declare function requestProjectBlobUpload(hash: string, size: number, opts?: {
1766
+ org?: string;
1767
+ authToken?: string;
1768
+ }): Promise<{
1769
+ url: string;
1770
+ key: string;
1771
+ }>;
1772
+ /**
1773
+ * @internal Complete (HEAD-verify + index) an uploaded file blob.
1774
+ * @param {string} hash
1775
+ * @param {{ org?: string, authToken?: string }} [opts]
1776
+ * @returns {Promise<{ hash: string, size: number }>}
1777
+ */
1778
+ declare function completeProjectBlobUpload(hash: string, opts?: {
1779
+ org?: string;
1780
+ authToken?: string;
1781
+ }): Promise<{
1782
+ hash: string;
1783
+ size: number;
1784
+ }>;
1785
+ /**
1786
+ * @internal Presigned GET url for a file blob; null when absent.
1787
+ * @param {string} hash
1788
+ * @param {{ org?: string, authToken?: string }} [opts]
1789
+ * @returns {Promise<{ url: string, size: number } | null>}
1790
+ */
1791
+ declare function requestProjectBlobDownload(hash: string, opts?: {
1792
+ org?: string;
1793
+ authToken?: string;
1794
+ }): Promise<{
1795
+ url: string;
1796
+ size: number;
1797
+ } | null>;
1798
+ /**
1799
+ * @internal Revision history of a project, newest first.
1800
+ * @param {string} project
1801
+ * @param {{ org?: string, authToken?: string }} [opts]
1802
+ * @returns {Promise<{ revisions: import("@needle-tools/cloud-sdk/types/api.projects").ProjectRevisionInfo[] }>}
1803
+ */
1804
+ declare function listProjectRevisions(project: string, opts?: {
1805
+ org?: string;
1806
+ authToken?: string;
1807
+ }): Promise<{
1808
+ revisions: ProjectRevisionInfo[];
1809
+ }>;
1810
+
1406
1811
  /**
1407
1812
  * Start the checkout process
1408
1813
  * @param {{ price_id:string }} args
@@ -1420,5 +1825,5 @@ declare namespace AuthScopes {
1420
1825
  let All: string[];
1421
1826
  }
1422
1827
 
1423
- export { Auth, AuthScopes, NeedleLoginButton, createChatSession, getContent, getDeployments, getPublicContent, getUserLicenses, listChats, listContent, listPublicContent, ownsProduct, startCheckoutSession, uploadFiles };
1828
+ export { Auth, AuthScopes, NeedleLoginButton, archiveProject, checkProjectBlobs, cloneProject, completeProjectBlobUpload, createChatSession, createProject, deleteProject, getContent, getDeployments, getProjectHead, getPublicContent, getUserLicenses, listChats, listContent, listProjectRevisions, listProjects, listPublicContent, ownsProduct, pullProjectRevision, pushProjectRevision, requestProjectBlobDownload, requestProjectBlobUpload, restoreProject, startCheckoutSession, unarchiveProject, updateProject, uploadFiles };
1424
1829
  export type { AuthData, AuthInitOpts, ChatAuthOpts, ChatSessionHandle, ChatSessionOptions, ChatSessionSendOptions, Deployment, Filelike, LogtoUserCustomData, RecentChatsResponse, ResourceUrl, ToolDefinition, UserInfoResponse };