@xfey/tutti 0.1.109 → 0.1.111

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 (56) hide show
  1. package/README.md +4 -2
  2. package/dist/chat-assistant/diagnostics.d.ts +1 -0
  3. package/dist/chat-assistant/index.js +25 -17
  4. package/dist/chat-assistant/reference-freshness-smoke-cli.d.ts +2 -0
  5. package/dist/chat-assistant/reference-freshness-smoke-cli.js +40 -0
  6. package/dist/chat-assistant/reference-freshness-smoke.d.ts +23 -0
  7. package/dist/chat-assistant/reference-freshness-smoke.js +274 -0
  8. package/dist/collaboration-ingestion/external-source.js +2 -0
  9. package/dist/collaboration-ingestion/index.d.ts +1 -1
  10. package/dist/collaboration-ingestion/index.js +1 -1
  11. package/dist/collaboration-ingestion/main-chat.js +9 -2
  12. package/dist/collaboration-ingestion/managed-reference-sources.d.ts +3 -1
  13. package/dist/collaboration-ingestion/managed-reference-sources.js +7 -0
  14. package/dist/collaboration-ingestion/types.d.ts +1 -0
  15. package/dist/collaboration-state/task-compile-context.d.ts +1 -1
  16. package/dist/control-plane/scratchpad-source-messages.js +9 -3
  17. package/dist/control-plane/task-source-context-types.d.ts +1 -1
  18. package/dist/control-plane/task-source-context.js +4 -2
  19. package/dist/reference-access/message-context.d.ts +6 -0
  20. package/dist/reference-access/message-context.js +11 -0
  21. package/dist/reference-access/read-evidence.d.ts +2 -0
  22. package/dist/reference-access/read-evidence.js +8 -0
  23. package/dist/server-shell/cli/external-reference-runtime.js +1 -0
  24. package/dist/server-shell/cli/relay-registration.js +1 -0
  25. package/dist/server-shell/http/routes/agent-context-external-reference-routes.js +1 -0
  26. package/dist/server-shell/http/routes/agent-context-messages-routes.js +2 -0
  27. package/dist/server-shell/http/routes/agent-context-reference-routes.js +37 -3
  28. package/dist/server-shell/http/routes/agent-context-references.d.ts +11 -0
  29. package/dist/server-shell/http/routes/agent-context-references.js +14 -0
  30. package/node_modules/@tutti/relay-client/dist/host-control.d.ts +1 -0
  31. package/node_modules/@tutti/relay-client/dist/host-control.js +3 -0
  32. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.d.ts +3 -1
  33. package/node_modules/@tutti/shared/dist/schemas/api/external-references.d.ts +27 -4
  34. package/node_modules/@tutti/shared/dist/schemas/api/external-references.js +32 -3
  35. package/node_modules/@tutti/shared/dist/schemas/api/index.d.ts +1 -1
  36. package/node_modules/@tutti/shared/dist/schemas/api/index.js +1 -1
  37. package/node_modules/@tutti/shared/dist/schemas/api/messages.d.ts +12 -4
  38. package/node_modules/@tutti/shared/dist/schemas/api/messages.js +3 -1
  39. package/node_modules/@tutti/shared/dist/schemas/api/platform-sessions.d.ts +5 -3
  40. package/node_modules/@tutti/shared/dist/schemas/api/platform-sessions.js +16 -1
  41. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.d.ts +3 -1
  42. package/node_modules/@tutti/shared/dist/schemas/internal/external-references.d.ts +15 -2
  43. package/node_modules/@tutti/shared/dist/schemas/internal/external-references.js +4 -2
  44. package/node_modules/@tutti/shared/dist/schemas/internal/platform-integration.d.ts +49 -8
  45. package/node_modules/@tutti/shared/dist/schemas/internal/platform-integration.js +14 -2
  46. package/package.json +1 -1
  47. package/prompts/chat-assistant.md +17 -15
  48. package/prompts/procedures/scratchpad-refresh.md +22 -2
  49. package/prompts/procedures/task-compile.md +1 -0
  50. package/prompts/runs/task-execute.md +2 -0
  51. package/prompts/skills/README.md +1 -1
  52. package/prompts/skills/read-references/README.md +2 -2
  53. package/prompts/skills/read-references/SKILL.md +24 -37
  54. package/web/assets/{homepage-motion-scene-B6yPJnY8.js → homepage-motion-scene-TmkKf8wQ.js} +1 -1
  55. package/web/assets/{index-aQnJ5JoI.js → index-B1oL1p9_.js} +3 -3
  56. package/web/index.html +1 -1
@@ -1,6 +1,6 @@
1
1
  import type { ClarificationRequestPayload, ExternalReferenceDescriptor } from "@tutti/shared/schemas/api";
2
2
  export type PromptSourceMessage = {
3
- role: "human" | "tutti";
3
+ role: "human" | "tutti" | "operator";
4
4
  author_display_name?: string;
5
5
  text: string;
6
6
  external_references?: ExternalReferenceDescriptor[];
@@ -8,10 +8,12 @@ function promptSourceMessage(db, source) {
8
8
  if (message.scope.kind !== "main_chat") {
9
9
  throw new Error("Task source message is outside main chat");
10
10
  }
11
- if (message.message_kind === "user_text" && message.author.kind === "human") {
11
+ if (message.message_kind === "user_text" &&
12
+ (message.author.kind === "human" ||
13
+ (message.author.kind === "system" && message.refs?.development_operator === true))) {
12
14
  const displayName = message.author.display_name?.trim();
13
15
  return {
14
- role: "human",
16
+ role: message.refs?.development_operator === true ? "operator" : "human",
15
17
  ...(displayName === undefined || displayName === ""
16
18
  ? {}
17
19
  : { author_display_name: displayName }),
@@ -0,0 +1,6 @@
1
+ import type { MessageProjection } from "@tutti/shared/schemas/api";
2
+ /** Location hints, not access grants or current-read evidence. Never copy private locators. */
3
+ export declare function externalReferenceMessageContext(refs: MessageProjection["refs"]): {
4
+ external_reference_sources?: string[];
5
+ };
6
+ //# sourceMappingURL=message-context.d.ts.map
@@ -0,0 +1,11 @@
1
+ /** Location hints, not access grants or current-read evidence. Never copy private locators. */
2
+ export function externalReferenceMessageContext(refs) {
3
+ const sources = [
4
+ ...(refs?.external_references?.map((source) => source.source_ref) ?? []),
5
+ ...(refs?.external_reference_reads ?? []),
6
+ ];
7
+ return sources.length === 0
8
+ ? {}
9
+ : { external_reference_sources: [...new Set(sources)].slice(0, 16) };
10
+ }
11
+ //# sourceMappingURL=message-context.js.map
@@ -1,6 +1,8 @@
1
1
  import type { SqliteDatabase } from "../store/index.js";
2
2
  import type { ReferenceCopy } from "./cache.js";
3
3
  import type { ReferenceInvocation } from "./service.js";
4
+ /** Prior answer context only: a source reference is not proof of freshness in a later turn. */
5
+ export declare function readExternalReferenceReadSources(db: SqliteDatabase, invocationRef: string): string[];
4
6
  /** Durable observation, separate from evictable cache metadata; no content or locator. */
5
7
  export declare function recordExternalReferenceRead(db: SqliteDatabase, invocation: ReferenceInvocation, copy: ReferenceCopy): void;
6
8
  //# sourceMappingURL=read-evidence.d.ts.map
@@ -1,3 +1,11 @@
1
+ /** Prior answer context only: a source reference is not proof of freshness in a later turn. */
2
+ export function readExternalReferenceReadSources(db, invocationRef) {
3
+ return db
4
+ .prepare(`SELECT source_ref FROM external_reference_reads
5
+ WHERE invocation_ref = ? ORDER BY checked_at, source_ref LIMIT 16`)
6
+ .all(invocationRef)
7
+ .map((row) => row.source_ref);
8
+ }
1
9
  /** Durable observation, separate from evictable cache metadata; no content or locator. */
2
10
  export function recordExternalReferenceRead(db, invocation, copy) {
3
11
  const invocationRef = invocation.reference_invocation_ref;
@@ -17,6 +17,7 @@ export function createExternalReferenceRuntime(options) {
17
17
  return requestExternalReferences({
18
18
  relayUrl: preparation.relay_url,
19
19
  body: {
20
+ supports_drive_files: true,
20
21
  project_identity: { source: "git_config", project_id: preparation.project_id },
21
22
  host_auth: { kind: "host_registration_secret_v1", secret: secret.secret },
22
23
  relay_project_ref: relay.relay_project_ref,
@@ -37,6 +37,7 @@ export async function registerHostWithRelay(options) {
37
37
  joinToken: { mode: options.joinTokenMode ?? "rotate" },
38
38
  capabilities: {
39
39
  integration_source_ingestion_v1: true,
40
+ integration_development_bot_v1: true,
40
41
  integration_external_references_v1: true,
41
42
  integration_attachment_ingestion_v1: true,
42
43
  integration_managed_reference_ingestion_v1: true,
@@ -76,6 +76,7 @@ export function registerAgentContextExternalReferenceRoutes(app, options) {
76
76
  kind: text === undefined ? "local_file" : "text",
77
77
  ...copy,
78
78
  cache_hit: result.cache_hit,
79
+ provenance: { origin: "external_reference", verification: "this_invocation" },
79
80
  ...(safeText === undefined
80
81
  ? {}
81
82
  : {
@@ -1,4 +1,5 @@
1
1
  import { readMainChatMessageWindow } from "../../../collaboration-state/index.js";
2
+ import { externalReferenceMessageContext } from "../../../reference-access/message-context.js";
2
3
  import { authorizeAgentContextRequest } from "./agent-context-auth.js";
3
4
  import { AgentContextBadRequestError } from "./agent-context-errors.js";
4
5
  import { boundedLimit, queryString, truncateText } from "./agent-context-query.js";
@@ -44,6 +45,7 @@ export function registerAgentContextMessageRoutes(app, options) {
44
45
  },
45
46
  body: body.text,
46
47
  body_truncated: body.truncated,
48
+ ...externalReferenceMessageContext(message.refs),
47
49
  ...(message.refs?.reference_file === undefined
48
50
  ? {}
49
51
  : {
@@ -3,11 +3,17 @@ import { VIEWER_HARD_READ_LIMIT_BYTES, WorkspaceOpsError, readReferenceSummaryIn
3
3
  import { authorizeAgentContextRequest } from "./agent-context-auth.js";
4
4
  import { AgentContextBadRequestError } from "./agent-context-errors.js";
5
5
  import { boundedLimit, pageByOffset, queryString } from "./agent-context-query.js";
6
- import { mapReferenceUnavailableReason, referenceListItems, } from "./agent-context-references.js";
6
+ import { mapReferenceUnavailableReason, localReferenceProvenance, managedReferencePaths, referenceListItems, } from "./agent-context-references.js";
7
7
  import { AGENT_CONTEXT_BASE_PATH, REFERENCE_FILE_DEFAULT_MAX_BYTES, REFERENCE_FILE_MAX_BYTES, REFERENCES_LIMIT_DEFAULT, REFERENCES_LIMIT_MAX, requireWorkspaceRoot, } from "./agent-context-shared.js";
8
8
  export function registerAgentContextReferenceRoutes(app, options) {
9
9
  app.get(`${AGENT_CONTEXT_BASE_PATH}/references`, (request) => {
10
- authorizeAgentContextRequest(request, options, "references:list");
10
+ const invocation = authorizeAgentContextRequest(request, options, "references:list");
11
+ const started = performance.now();
12
+ request.log.info({
13
+ stage: "local_reference_request",
14
+ action: "list",
15
+ invocation_ref: invocation.reference_invocation_ref,
16
+ }, "Local Reference request started");
11
17
  const query = request.query;
12
18
  const limit = boundedLimit(query.limit, {
13
19
  default: REFERENCES_LIMIT_DEFAULT,
@@ -20,6 +26,12 @@ export function registerAgentContextReferenceRoutes(app, options) {
20
26
  ...(cursor === undefined ? {} : { cursor }),
21
27
  limit,
22
28
  });
29
+ request.log.info({
30
+ stage: "local_reference_list",
31
+ invocation_ref: invocation.reference_invocation_ref,
32
+ source_count: page.items.length,
33
+ elapsed_ms: Math.round(performance.now() - started),
34
+ }, "Local References listed; remote freshness not checked");
23
35
  return {
24
36
  items: page.items,
25
37
  page: {
@@ -29,7 +41,13 @@ export function registerAgentContextReferenceRoutes(app, options) {
29
41
  };
30
42
  });
31
43
  app.get(`${AGENT_CONTEXT_BASE_PATH}/references/file`, (request) => {
32
- authorizeAgentContextRequest(request, options, "references:read");
44
+ const invocation = authorizeAgentContextRequest(request, options, "references:read");
45
+ const started = performance.now();
46
+ const diagnosticFields = {
47
+ invocation_ref: invocation.reference_invocation_ref,
48
+ action: "read",
49
+ };
50
+ request.log.info({ ...diagnosticFields, stage: "local_reference_request" }, "Local Reference request started");
33
51
  const path = queryString(request.query.path);
34
52
  if (path === undefined || path.trim() === "") {
35
53
  throw new AgentContextBadRequestError("Reference path is required");
@@ -49,12 +67,21 @@ export function registerAgentContextReferenceRoutes(app, options) {
49
67
  entry: file.file,
50
68
  summaries: readReferenceSummaryIndex({ workspaceRoot: requireWorkspaceRoot(options) }),
51
69
  });
70
+ const provenance = localReferenceProvenance(file.file.path, managedReferencePaths(options));
71
+ request.log.info({
72
+ ...diagnosticFields,
73
+ stage: "local_reference_read",
74
+ ...provenance,
75
+ result_kind: file.content.kind,
76
+ elapsed_ms: Math.round(performance.now() - started),
77
+ }, "Local Reference read; remote freshness not checked");
52
78
  if (file.content.kind !== "text") {
53
79
  return {
54
80
  kind: "unavailable",
55
81
  path,
56
82
  reason: file.content.reason,
57
83
  summary,
84
+ provenance,
58
85
  };
59
86
  }
60
87
  return {
@@ -62,12 +89,19 @@ export function registerAgentContextReferenceRoutes(app, options) {
62
89
  path: file.file.path,
63
90
  name: file.file.name,
64
91
  summary,
92
+ provenance,
65
93
  text: redactText(file.content.text),
66
94
  truncated: file.content.truncated,
67
95
  bytes_read: file.content.bytes_returned,
68
96
  };
69
97
  }
70
98
  catch (error) {
99
+ request.log.warn({
100
+ ...diagnosticFields,
101
+ stage: "local_reference_unavailable",
102
+ reason_code: error instanceof WorkspaceOpsError ? error.code : "reference_read_unavailable",
103
+ elapsed_ms: Math.round(performance.now() - started),
104
+ }, "Local Reference read unavailable");
71
105
  if (error instanceof WorkspaceOpsError) {
72
106
  return {
73
107
  kind: "unavailable",
@@ -1,15 +1,26 @@
1
1
  import { WorkspaceOpsError } from "../../../workspace-ops/index.js";
2
+ import type { HostProjectStore } from "../../../store/index.js";
2
3
  type AgentContextWorkspaceOptions = {
4
+ store?: HostProjectStore;
3
5
  workspaceOps?: {
4
6
  workspaceRoot: string;
5
7
  };
6
8
  now?: () => Date;
7
9
  };
10
+ export declare function localReferenceProvenance(path: string, managedPaths: ReadonlySet<string>): {
11
+ origin: "local_reference" | "managed_snapshot";
12
+ verification: "local_only";
13
+ };
14
+ export declare function managedReferencePaths(options: AgentContextWorkspaceOptions): ReadonlySet<string>;
8
15
  export declare function mapReferenceUnavailableReason(error: WorkspaceOpsError): string;
9
16
  export declare function referenceListItems(options: AgentContextWorkspaceOptions): {
10
17
  can_read_text: boolean;
11
18
  blocked_reason?: string;
12
19
  summary: import("../../../workspace-ops/types.js").ReferenceSummaryProjection;
20
+ provenance: {
21
+ origin: "local_reference" | "managed_snapshot";
22
+ verification: "local_only";
23
+ };
13
24
  extension?: string;
14
25
  media_type?: string;
15
26
  path: string;
@@ -1,5 +1,17 @@
1
1
  import { REFERENCE_INDEX_PATH, WorkspaceOpsError, readReferenceFileEntries, readReferenceSummaryIndex, readViewerFile, referenceFileCategoryForPath, referenceMediaTypeForPath, referenceSummaryProjectionForEntry, } from "../../../workspace-ops/index.js";
2
2
  import { AgentContextBadRequestError } from "./agent-context-errors.js";
3
+ import { readManagedReferenceSourcePaths } from "../../../collaboration-ingestion/index.js";
4
+ export function localReferenceProvenance(path, managedPaths) {
5
+ return {
6
+ origin: managedPaths.has(path) ? "managed_snapshot" : "local_reference",
7
+ verification: "local_only",
8
+ };
9
+ }
10
+ export function managedReferencePaths(options) {
11
+ return options.store === undefined
12
+ ? new Set()
13
+ : readManagedReferenceSourcePaths(options.store.db);
14
+ }
3
15
  function requireWorkspaceRoot(options) {
4
16
  if (options.workspaceOps === undefined) {
5
17
  throw new AgentContextBadRequestError("Workspace viewer is unavailable");
@@ -24,6 +36,7 @@ export function mapReferenceUnavailableReason(error) {
24
36
  export function referenceListItems(options) {
25
37
  const workspaceRoot = requireWorkspaceRoot(options);
26
38
  const summaries = readReferenceSummaryIndex({ workspaceRoot });
39
+ const managedPaths = managedReferencePaths(options);
27
40
  return referenceEntries(options).map((entry) => {
28
41
  const category = referenceFileCategoryForPath(entry.path) ?? "file";
29
42
  const mediaType = referenceMediaTypeForPath(entry.path);
@@ -37,6 +50,7 @@ export function referenceListItems(options) {
37
50
  ...(mediaType === undefined ? {} : { media_type: mediaType }),
38
51
  ...(entry.extension === undefined ? {} : { extension: entry.extension }),
39
52
  summary,
53
+ provenance: localReferenceProvenance(entry.path, managedPaths),
40
54
  ...read,
41
55
  };
42
56
  });
@@ -44,6 +44,7 @@ export type RegisterRelayHostConnectionPayload = {
44
44
  browser_secret_write: false;
45
45
  repo_viewer: boolean;
46
46
  integration_source_ingestion_v1?: boolean;
47
+ integration_development_bot_v1?: boolean;
47
48
  integration_external_references_v1?: boolean;
48
49
  integration_attachment_ingestion_v1?: boolean;
49
50
  integration_managed_reference_ingestion_v1?: boolean;
@@ -57,6 +57,9 @@ function createRegisterPayload(options) {
57
57
  browser_secret_write: false,
58
58
  repo_viewer: capabilities.repo_viewer ?? false,
59
59
  integration_source_ingestion_v1: capabilities.integration_source_ingestion_v1 ?? false,
60
+ ...(capabilities.integration_development_bot_v1 === true
61
+ ? { integration_development_bot_v1: true }
62
+ : {}),
60
63
  integration_external_references_v1: capabilities.integration_external_references_v1 ?? false,
61
64
  integration_attachment_ingestion_v1: capabilities.integration_attachment_ingestion_v1 ?? false,
62
65
  integration_managed_reference_ingestion_v1: capabilities.integration_managed_reference_ingestion_v1 ?? false,
@@ -507,9 +507,11 @@ export declare const SendClarificationRoundMessageResultSchema: import("@sinclai
507
507
  message_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"user_text">, import("@sinclair/typebox").TLiteral<"agent_text">, import("@sinclair/typebox").TLiteral<"system_notice">, import("@sinclair/typebox").TLiteral<"clarification_request">, import("@sinclair/typebox").TLiteral<"clarification_card">]>;
508
508
  body: import("@sinclair/typebox").TString;
509
509
  refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
510
+ development_operator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<true>>;
511
+ external_reference_reads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
510
512
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
511
513
  source_ref: import("@sinclair/typebox").TString;
512
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
514
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
513
515
  name: import("@sinclair/typebox").TString;
514
516
  created_at: import("@sinclair/typebox").TString;
515
517
  }>>>;
@@ -1,8 +1,21 @@
1
1
  import { type Static } from "@sinclair/typebox";
2
+ export type FeishuExternalReferenceLocator = {
3
+ kind: "docx" | "wiki" | "file";
4
+ token: string;
5
+ };
6
+ /** Private locator parsing only; callers must never fetch the supplied URL. */
7
+ export declare function parseFeishuExternalReferenceInput(value: string): FeishuExternalReferenceLocator | null;
2
8
  export declare const ExternalReferenceRefSchema: import("@sinclair/typebox").TString;
9
+ export declare const ReferenceSubmissionRefSchema: import("@sinclair/typebox").TString;
10
+ export declare const ReferenceSubmissionSchema: import("@sinclair/typebox").TObject<{
11
+ submission_ref: import("@sinclair/typebox").TString;
12
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"docx">, import("@sinclair/typebox").TLiteral<"wiki">, import("@sinclair/typebox").TLiteral<"file">]>;
13
+ created_at: import("@sinclair/typebox").TString;
14
+ expires_at: import("@sinclair/typebox").TString;
15
+ }>;
3
16
  export declare const ExternalReferenceDescriptorSchema: import("@sinclair/typebox").TObject<{
4
17
  source_ref: import("@sinclair/typebox").TString;
5
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
18
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
6
19
  name: import("@sinclair/typebox").TString;
7
20
  created_at: import("@sinclair/typebox").TString;
8
21
  }>;
@@ -10,14 +23,24 @@ export declare const ExternalReferenceListSchema: import("@sinclair/typebox").TO
10
23
  can_register: import("@sinclair/typebox").TBoolean;
11
24
  items: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
12
25
  source_ref: import("@sinclair/typebox").TString;
13
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
26
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
14
27
  name: import("@sinclair/typebox").TString;
15
28
  created_at: import("@sinclair/typebox").TString;
16
29
  }>>;
30
+ pending: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
31
+ submission_ref: import("@sinclair/typebox").TString;
32
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"docx">, import("@sinclair/typebox").TLiteral<"wiki">, import("@sinclair/typebox").TLiteral<"file">]>;
33
+ created_at: import("@sinclair/typebox").TString;
34
+ expires_at: import("@sinclair/typebox").TString;
35
+ }>>>;
17
36
  }>;
18
- export declare const RegisterExternalReferenceBodySchema: import("@sinclair/typebox").TObject<{
37
+ export declare const RegisterExternalReferenceBodySchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
19
38
  document_url: import("@sinclair/typebox").TString;
20
- }>;
39
+ }>, import("@sinclair/typebox").TObject<{
40
+ submission_ref: import("@sinclair/typebox").TString;
41
+ }>]>;
42
+ export type RegisterExternalReferenceBody = Static<typeof RegisterExternalReferenceBodySchema>;
43
+ export type ReferenceSubmission = Static<typeof ReferenceSubmissionSchema>;
21
44
  export type ExternalReferenceDescriptor = Static<typeof ExternalReferenceDescriptorSchema>;
22
45
  export type ExternalReferenceList = Static<typeof ExternalReferenceListSchema>;
23
46
  //# sourceMappingURL=external-references.d.ts.map
@@ -1,10 +1,35 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import { IsoDateTimeStringSchema } from "../domain/index.js";
3
+ import { parseFeishuDocumentUrl } from "./feishu-documents.js";
4
+ /** Private locator parsing only; callers must never fetch the supplied URL. */
5
+ export function parseFeishuExternalReferenceInput(value) {
6
+ if (value.length > 2048 ||
7
+ [...value].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127))
8
+ return null;
9
+ const input = value.trim();
10
+ if (/^[A-Za-z0-9]{27}$/u.test(input))
11
+ return { kind: "docx", token: input };
12
+ const document = parseFeishuDocumentUrl(input);
13
+ if (document)
14
+ return document;
15
+ const file = /^https:\/\/(?:[a-z0-9-]+\.)?(?:feishu\.cn|larksuite\.com)(?::443)?\/file\/([a-z0-9]{1,256})\/?(?:[?#][^\s]*)?$/iu.exec(input);
16
+ return file?.[1] ? { kind: "file", token: file[1] } : null;
17
+ }
3
18
  export const ExternalReferenceRefSchema = Type.String({ pattern: "^external_ref_[a-f0-9]{32}$" });
19
+ export const ReferenceSubmissionRefSchema = Type.String({
20
+ pattern: "^ref_submission_[a-f0-9]{32}$",
21
+ });
22
+ export const ReferenceSubmissionSchema = Type.Object({
23
+ submission_ref: ReferenceSubmissionRefSchema,
24
+ kind: Type.Union([Type.Literal("docx"), Type.Literal("wiki"), Type.Literal("file")]),
25
+ created_at: IsoDateTimeStringSchema,
26
+ expires_at: IsoDateTimeStringSchema,
27
+ }, { additionalProperties: false });
4
28
  export const ExternalReferenceDescriptorSchema = Type.Object({
5
29
  source_ref: ExternalReferenceRefSchema,
6
30
  kind: Type.Union([
7
31
  Type.Literal("feishu_docx"),
32
+ Type.Literal("feishu_drive_file"),
8
33
  Type.Literal("feishu_file"),
9
34
  Type.Literal("feishu_image"),
10
35
  ]),
@@ -14,8 +39,12 @@ export const ExternalReferenceDescriptorSchema = Type.Object({
14
39
  export const ExternalReferenceListSchema = Type.Object({
15
40
  can_register: Type.Boolean(),
16
41
  items: Type.Array(ExternalReferenceDescriptorSchema, { maxItems: 500 }),
42
+ pending: Type.Optional(Type.Array(ReferenceSubmissionSchema, { maxItems: 20 })),
17
43
  }, { additionalProperties: false });
18
- export const RegisterExternalReferenceBodySchema = Type.Object({
19
- document_url: Type.String({ minLength: 1, maxLength: 2048 }),
20
- }, { additionalProperties: false });
44
+ export const RegisterExternalReferenceBodySchema = Type.Union([
45
+ Type.Object({
46
+ document_url: Type.String({ minLength: 1, maxLength: 2048 }),
47
+ }, { additionalProperties: false }),
48
+ Type.Object({ submission_ref: ReferenceSubmissionRefSchema }, { additionalProperties: false }),
49
+ ]);
21
50
  //# sourceMappingURL=external-references.js.map
@@ -5,7 +5,7 @@ export { CompleteDesktopEntryContinuationBodySchema, CompleteDesktopEntryContinu
5
5
  export type { CompleteDesktopEntryContinuationBody, CreateDesktopEntryContinuationResponse, GetDesktopEntryContinuationResponse, SealedDesktopEntryPayload, } from "./desktop-entry-continuations.js";
6
6
  export { LOCAL_CONSOLE_ACCOUNT_HANDOFF_TOKEN_MAX_LENGTH, LOCAL_CONSOLE_ACCOUNT_HANDOFF_TOKEN_MIN_LENGTH, RegisterLocalConsoleAccountHandoffBodySchema, RegisterLocalConsoleAccountHandoffResponseSchema, } from "./local-console-account-handoffs.js";
7
7
  export type { RegisterLocalConsoleAccountHandoffBody, RegisterLocalConsoleAccountHandoffResponse, } from "./local-console-account-handoffs.js";
8
- export { FEISHU_BROWSER_HANDOFF_TOKEN_LENGTH, FEISHU_DOCX_READWRITE_USER_SCOPE, FEISHU_DOCX_REQUIRED_USER_SCOPE, FEISHU_H5_AUTHORIZATION_CODE_MAX_LENGTH, FEISHU_H5_REQUIRED_USER_SCOPE, FEISHU_OFFLINE_ACCESS_SCOPE, FEISHU_WIKI_REQUIRED_USER_SCOPE, FeishuDocumentAuthorizationBootstrapBodySchema, FEISHU_PLATFORM_STATE_LENGTH, FeishuPlatformSessionBootstrapBodySchema, FeishuPlatformSessionBootstrapResponseSchema, FeishuBrowserHandoffResponseSchema, FeishuBrowserHandoffTokenSchema, ConsumeFeishuBrowserHandoffBodySchema, FeishuDocumentAuthorizationBootstrapResponseSchema, FeishuDocumentAuthorizationExchangeBodySchema, FeishuDocumentAuthorizationProjectionSchema, FeishuPlatformSessionExchangeBodySchema, FeishuPlatformSessionProjectionSchema, FeishuPlatformStateSchema, hasFeishuDocxReadCapability, hasFeishuWikiReadCapability, } from "./platform-sessions.js";
8
+ export { FEISHU_BROWSER_HANDOFF_TOKEN_LENGTH, FEISHU_DOCX_READWRITE_USER_SCOPE, FEISHU_DOCX_REQUIRED_USER_SCOPE, FEISHU_DRIVE_DOWNLOAD_USER_SCOPE, FEISHU_H5_AUTHORIZATION_CODE_MAX_LENGTH, FEISHU_H5_REQUIRED_USER_SCOPE, FEISHU_OFFLINE_ACCESS_SCOPE, FEISHU_WIKI_REQUIRED_USER_SCOPE, FeishuDocumentAuthorizationBootstrapBodySchema, FEISHU_PLATFORM_STATE_LENGTH, FeishuPlatformSessionBootstrapBodySchema, FeishuPlatformSessionBootstrapResponseSchema, FeishuBrowserHandoffResponseSchema, FeishuBrowserHandoffTokenSchema, ConsumeFeishuBrowserHandoffBodySchema, FeishuDocumentAuthorizationBootstrapResponseSchema, FeishuDocumentAuthorizationExchangeBodySchema, FeishuDocumentAuthorizationProjectionSchema, FeishuPlatformSessionExchangeBodySchema, FeishuPlatformSessionProjectionSchema, FeishuPlatformStateSchema, hasFeishuDocxReadCapability, hasFeishuDriveDownloadCapability, hasFeishuWikiReadCapability, } from "./platform-sessions.js";
9
9
  export type { FeishuPlatformSessionBootstrapBody, FeishuPlatformSessionBootstrapResponse, FeishuBrowserHandoffResponse, ConsumeFeishuBrowserHandoffBody, FeishuDocumentAuthorizationBootstrapResponse, FeishuDocumentAuthorizationProfile, FeishuDocumentAuthorizationExchangeBody, FeishuDocumentAuthorizationProjection, FeishuPlatformSessionExchangeBody, FeishuPlatformSessionProjection, } from "./platform-sessions.js";
10
10
  export { ApiErrorCodeSchema, ApiErrorResponseSchema, CommandDispositionBaseSchema, CursorPageRequestSchema, DEFAULT_SSE_REPLAY_WINDOW_POLICY, InterruptedCommandDispositionSchema, QueryInvalidationHintSchema, RelayInvalidationHintSchema, RelaySseEventTypeSchema, SseReplayWindowPolicySchema, WorkspaceSseEventTypeSchema, commandEnvelopeSchema, commandResponseSchema, commandResponseWithResultSchema, cursorPageSchema, relaySseEventSchema, timelineWindowSchema, workspaceSseEventSchema, } from "./primitives.js";
11
11
  export { GetProviderModelsResponseSchema, MAX_PROVIDER_MODEL_NAME_LENGTH, ProviderConfigInvalidReasonCodeSchema, ProviderConfigProjectionSchema, ProviderModelDiscoveryUnavailableReasonSchema, ProviderModelNameSchema, ProviderModelValidationFailureReasonSchema, ProviderUnavailableReasonCodeSchema, ProjectProviderUnavailableReasonSchema, UpdateProviderDefaultModelBodySchema, UpdateProviderDefaultModelDispositionSchema, UpdateProviderDefaultModelPayloadSchema, UpdateProviderDefaultModelResponseSchema, } from "./provider-config.js";
@@ -2,7 +2,7 @@ export * from "./openapi.js";
2
2
  export { ARTIFACT_FEEDBACK_MAX_ANNOTATIONS, ARTIFACT_FEEDBACK_MAX_AUTHORED_TEXT_LENGTH, ARTIFACT_FEEDBACK_MAX_COMMENT_LENGTH, ARTIFACT_FEEDBACK_MAX_SERIALIZED_BYTES, ARTIFACT_FEEDBACK_MAX_SUMMARY_LENGTH, ArtifactElementAnchorSchema, ArtifactElementKindSchema, ArtifactElementTargetSchema, ArtifactFeedbackAnnotationSchema, ArtifactFeedbackCommandSchema, ArtifactFeedbackRefSchema, ArtifactSemanticContextSchema, ArtifactSemanticSnapshotSchema, ArtifactSemanticStateSchema, } from "./artifact-feedback.js";
3
3
  export { CompleteDesktopEntryContinuationBodySchema, CompleteDesktopEntryContinuationResponseSchema, CreateDesktopEntryContinuationResponseSchema, DESKTOP_ENTRY_COMPLETION_TOKEN_LENGTH, DESKTOP_ENTRY_PAYLOAD_KEY_LENGTH, DESKTOP_ENTRY_SEALED_IV_LENGTH, DesktopEntryCompletionTokenSchema, DesktopEntryContinuationPendingProjectionSchema, DesktopEntryContinuationReadyProjectionSchema, DesktopEntryPayloadKeySchema, GetDesktopEntryContinuationResponseSchema, MAX_DESKTOP_ENTRY_SEALED_CIPHERTEXT_LENGTH, SealedDesktopEntryPayloadSchema, } from "./desktop-entry-continuations.js";
4
4
  export { LOCAL_CONSOLE_ACCOUNT_HANDOFF_TOKEN_MAX_LENGTH, LOCAL_CONSOLE_ACCOUNT_HANDOFF_TOKEN_MIN_LENGTH, RegisterLocalConsoleAccountHandoffBodySchema, RegisterLocalConsoleAccountHandoffResponseSchema, } from "./local-console-account-handoffs.js";
5
- export { FEISHU_BROWSER_HANDOFF_TOKEN_LENGTH, FEISHU_DOCX_READWRITE_USER_SCOPE, FEISHU_DOCX_REQUIRED_USER_SCOPE, FEISHU_H5_AUTHORIZATION_CODE_MAX_LENGTH, FEISHU_H5_REQUIRED_USER_SCOPE, FEISHU_OFFLINE_ACCESS_SCOPE, FEISHU_WIKI_REQUIRED_USER_SCOPE, FeishuDocumentAuthorizationBootstrapBodySchema, FEISHU_PLATFORM_STATE_LENGTH, FeishuPlatformSessionBootstrapBodySchema, FeishuPlatformSessionBootstrapResponseSchema, FeishuBrowserHandoffResponseSchema, FeishuBrowserHandoffTokenSchema, ConsumeFeishuBrowserHandoffBodySchema, FeishuDocumentAuthorizationBootstrapResponseSchema, FeishuDocumentAuthorizationExchangeBodySchema, FeishuDocumentAuthorizationProjectionSchema, FeishuPlatformSessionExchangeBodySchema, FeishuPlatformSessionProjectionSchema, FeishuPlatformStateSchema, hasFeishuDocxReadCapability, hasFeishuWikiReadCapability, } from "./platform-sessions.js";
5
+ export { FEISHU_BROWSER_HANDOFF_TOKEN_LENGTH, FEISHU_DOCX_READWRITE_USER_SCOPE, FEISHU_DOCX_REQUIRED_USER_SCOPE, FEISHU_DRIVE_DOWNLOAD_USER_SCOPE, FEISHU_H5_AUTHORIZATION_CODE_MAX_LENGTH, FEISHU_H5_REQUIRED_USER_SCOPE, FEISHU_OFFLINE_ACCESS_SCOPE, FEISHU_WIKI_REQUIRED_USER_SCOPE, FeishuDocumentAuthorizationBootstrapBodySchema, FEISHU_PLATFORM_STATE_LENGTH, FeishuPlatformSessionBootstrapBodySchema, FeishuPlatformSessionBootstrapResponseSchema, FeishuBrowserHandoffResponseSchema, FeishuBrowserHandoffTokenSchema, ConsumeFeishuBrowserHandoffBodySchema, FeishuDocumentAuthorizationBootstrapResponseSchema, FeishuDocumentAuthorizationExchangeBodySchema, FeishuDocumentAuthorizationProjectionSchema, FeishuPlatformSessionExchangeBodySchema, FeishuPlatformSessionProjectionSchema, FeishuPlatformStateSchema, hasFeishuDocxReadCapability, hasFeishuDriveDownloadCapability, hasFeishuWikiReadCapability, } from "./platform-sessions.js";
6
6
  export { ApiErrorCodeSchema, ApiErrorResponseSchema, CommandDispositionBaseSchema, CursorPageRequestSchema, DEFAULT_SSE_REPLAY_WINDOW_POLICY, InterruptedCommandDispositionSchema, QueryInvalidationHintSchema, RelayInvalidationHintSchema, RelaySseEventTypeSchema, SseReplayWindowPolicySchema, WorkspaceSseEventTypeSchema, commandEnvelopeSchema, commandResponseSchema, commandResponseWithResultSchema, cursorPageSchema, relaySseEventSchema, timelineWindowSchema, workspaceSseEventSchema, } from "./primitives.js";
7
7
  export { GetProviderModelsResponseSchema, MAX_PROVIDER_MODEL_NAME_LENGTH, ProviderConfigInvalidReasonCodeSchema, ProviderConfigProjectionSchema, ProviderModelDiscoveryUnavailableReasonSchema, ProviderModelNameSchema, ProviderModelValidationFailureReasonSchema, ProviderUnavailableReasonCodeSchema, ProjectProviderUnavailableReasonSchema, UpdateProviderDefaultModelBodySchema, UpdateProviderDefaultModelDispositionSchema, UpdateProviderDefaultModelPayloadSchema, UpdateProviderDefaultModelResponseSchema, } from "./provider-config.js";
8
8
  export { ProviderUsageBreakdownProjectionSchema, ProviderUsageCategorySchema, ProviderUsageModelSummaryProjectionSchema, ProviderUsageProjectionSchema, ProviderUsageSourceSummaryProjectionSchema, } from "./provider-usage.js";
@@ -133,9 +133,11 @@ export declare const ArtifactPreviewRefSchema: import("@sinclair/typebox").TObje
133
133
  run_result_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
134
134
  }>;
135
135
  export declare const MessageRefsSchema: import("@sinclair/typebox").TObject<{
136
+ development_operator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<true>>;
137
+ external_reference_reads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
136
138
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
137
139
  source_ref: import("@sinclair/typebox").TString;
138
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
140
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
139
141
  name: import("@sinclair/typebox").TString;
140
142
  created_at: import("@sinclair/typebox").TString;
141
143
  }>>>;
@@ -343,9 +345,11 @@ export declare const MessageProjectionSchema: import("@sinclair/typebox").TObjec
343
345
  message_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"user_text">, import("@sinclair/typebox").TLiteral<"agent_text">, import("@sinclair/typebox").TLiteral<"system_notice">, import("@sinclair/typebox").TLiteral<"clarification_request">, import("@sinclair/typebox").TLiteral<"clarification_card">]>;
344
346
  body: import("@sinclair/typebox").TString;
345
347
  refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
348
+ development_operator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<true>>;
349
+ external_reference_reads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
346
350
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
347
351
  source_ref: import("@sinclair/typebox").TString;
348
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
352
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
349
353
  name: import("@sinclair/typebox").TString;
350
354
  created_at: import("@sinclair/typebox").TString;
351
355
  }>>>;
@@ -672,9 +676,11 @@ export declare const SendMainChatMessageResultSchema: import("@sinclair/typebox"
672
676
  message_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"user_text">, import("@sinclair/typebox").TLiteral<"agent_text">, import("@sinclair/typebox").TLiteral<"system_notice">, import("@sinclair/typebox").TLiteral<"clarification_request">, import("@sinclair/typebox").TLiteral<"clarification_card">]>;
673
677
  body: import("@sinclair/typebox").TString;
674
678
  refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
679
+ development_operator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<true>>;
680
+ external_reference_reads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
675
681
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
676
682
  source_ref: import("@sinclair/typebox").TString;
677
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
683
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
678
684
  name: import("@sinclair/typebox").TString;
679
685
  created_at: import("@sinclair/typebox").TString;
680
686
  }>>>;
@@ -903,9 +909,11 @@ export declare const MessageCreatedEventPayloadSchema: import("@sinclair/typebox
903
909
  message_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"user_text">, import("@sinclair/typebox").TLiteral<"agent_text">, import("@sinclair/typebox").TLiteral<"system_notice">, import("@sinclair/typebox").TLiteral<"clarification_request">, import("@sinclair/typebox").TLiteral<"clarification_card">]>;
904
910
  body: import("@sinclair/typebox").TString;
905
911
  refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
912
+ development_operator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<true>>;
913
+ external_reference_reads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
906
914
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
907
915
  source_ref: import("@sinclair/typebox").TString;
908
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
916
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
909
917
  name: import("@sinclair/typebox").TString;
910
918
  created_at: import("@sinclair/typebox").TString;
911
919
  }>>>;
@@ -1,5 +1,5 @@
1
1
  import { Type } from "@sinclair/typebox";
2
- import { ExternalReferenceDescriptorSchema } from "./external-references.js";
2
+ import { ExternalReferenceDescriptorSchema, ExternalReferenceRefSchema, } from "./external-references.js";
3
3
  import { ActivityRefSchema, ClarificationRoundRefSchema, ClarificationThreadRefSchema, CursorSchema, IsoDateTimeStringSchema, MessageIdSchema, RunResultIdSchema, TaskIdSchema, WorkflowInvocationRefSchema, } from "../domain/index.js";
4
4
  import { ACCOUNT_AVATAR_COLORS } from "../../domain/index.js";
5
5
  import { InterruptedCommandDispositionSchema, NonEmptyStringSchema, commandEnvelopeSchema, commandResponseWithResultSchema, timelineWindowSchema, } from "./primitives.js";
@@ -125,6 +125,8 @@ export const ArtifactPreviewRefSchema = Type.Object({
125
125
  run_result_id: Type.Optional(RunResultIdSchema),
126
126
  }, { additionalProperties: false });
127
127
  export const MessageRefsSchema = Type.Object({
128
+ development_operator: Type.Optional(Type.Literal(true)),
129
+ external_reference_reads: Type.Optional(Type.Array(ExternalReferenceRefSchema, { minItems: 1, maxItems: 16, uniqueItems: true })),
128
130
  external_references: Type.Optional(Type.Array(ExternalReferenceDescriptorSchema, { minItems: 1, maxItems: 16 })),
129
131
  task_id: Type.Optional(TaskIdSchema),
130
132
  activity_ref: Type.Optional(ActivityRefSchema),
@@ -5,13 +5,15 @@ export declare const FEISHU_DOCX_REQUIRED_USER_SCOPE = "docx:document:readonly";
5
5
  export declare const FEISHU_DOCX_READWRITE_USER_SCOPE = "docx:document";
6
6
  export declare const FEISHU_OFFLINE_ACCESS_SCOPE = "offline_access";
7
7
  export declare const FEISHU_WIKI_REQUIRED_USER_SCOPE = "wiki:node:read";
8
- export type FeishuDocumentAuthorizationProfile = "docx" | "wiki_docx";
8
+ export declare const FEISHU_DRIVE_DOWNLOAD_USER_SCOPE = "drive:file:download";
9
+ export type FeishuDocumentAuthorizationProfile = "docx" | "wiki_docx" | "drive_file";
9
10
  export declare const FEISHU_PLATFORM_STATE_LENGTH = 43;
10
11
  export declare const FEISHU_BROWSER_HANDOFF_TOKEN_LENGTH = 43;
11
12
  export declare function hasFeishuDocxReadCapability(scopes: readonly string[]): boolean;
12
13
  export declare function hasFeishuWikiReadCapability(scopes: readonly string[]): boolean;
14
+ export declare function hasFeishuDriveDownloadCapability(scopes: readonly string[]): boolean;
13
15
  export declare const FeishuDocumentAuthorizationBootstrapBodySchema: import("@sinclair/typebox").TObject<{
14
- profile: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"docx">, import("@sinclair/typebox").TLiteral<"wiki_docx">]>>;
16
+ profile: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"docx">, import("@sinclair/typebox").TLiteral<"wiki_docx">, import("@sinclair/typebox").TLiteral<"drive_file">]>>;
15
17
  }>;
16
18
  export declare const FeishuPlatformStateSchema: import("@sinclair/typebox").TString;
17
19
  export declare const FeishuBrowserHandoffTokenSchema: import("@sinclair/typebox").TString;
@@ -52,7 +54,7 @@ export declare const FeishuDocumentAuthorizationBootstrapResponseSchema: import(
52
54
  platform: import("@sinclair/typebox").TLiteral<"feishu">;
53
55
  app_id: import("@sinclair/typebox").TString;
54
56
  state: import("@sinclair/typebox").TString;
55
- authorization_scopes: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TTuple<[import("@sinclair/typebox").TLiteral<"docx:document:readonly">, import("@sinclair/typebox").TLiteral<"offline_access">]>, import("@sinclair/typebox").TTuple<[import("@sinclair/typebox").TLiteral<"docx:document:readonly">, import("@sinclair/typebox").TLiteral<"offline_access">, import("@sinclair/typebox").TLiteral<"wiki:node:read">]>]>;
57
+ authorization_scopes: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TTuple<[import("@sinclair/typebox").TLiteral<"docx:document:readonly">, import("@sinclair/typebox").TLiteral<"offline_access">, import("@sinclair/typebox").TLiteral<"drive:file:download">]>, import("@sinclair/typebox").TTuple<[import("@sinclair/typebox").TLiteral<"docx:document:readonly">, import("@sinclair/typebox").TLiteral<"offline_access">]>, import("@sinclair/typebox").TTuple<[import("@sinclair/typebox").TLiteral<"docx:document:readonly">, import("@sinclair/typebox").TLiteral<"offline_access">, import("@sinclair/typebox").TLiteral<"wiki:node:read">]>]>;
56
58
  expires_at: import("@sinclair/typebox").TString;
57
59
  }>;
58
60
  export declare const FeishuDocumentAuthorizationExchangeBodySchema: import("@sinclair/typebox").TObject<{
@@ -6,6 +6,7 @@ export const FEISHU_DOCX_REQUIRED_USER_SCOPE = "docx:document:readonly";
6
6
  export const FEISHU_DOCX_READWRITE_USER_SCOPE = "docx:document";
7
7
  export const FEISHU_OFFLINE_ACCESS_SCOPE = "offline_access";
8
8
  export const FEISHU_WIKI_REQUIRED_USER_SCOPE = "wiki:node:read";
9
+ export const FEISHU_DRIVE_DOWNLOAD_USER_SCOPE = "drive:file:download";
9
10
  export const FEISHU_PLATFORM_STATE_LENGTH = 43;
10
11
  export const FEISHU_BROWSER_HANDOFF_TOKEN_LENGTH = 43;
11
12
  export function hasFeishuDocxReadCapability(scopes) {
@@ -14,8 +15,17 @@ export function hasFeishuDocxReadCapability(scopes) {
14
15
  export function hasFeishuWikiReadCapability(scopes) {
15
16
  return scopes.some((scope) => [FEISHU_WIKI_REQUIRED_USER_SCOPE, "wiki:wiki:readonly", "wiki:wiki"].includes(scope));
16
17
  }
18
+ export function hasFeishuDriveDownloadCapability(scopes) {
19
+ return scopes.some((scope) => [
20
+ FEISHU_DRIVE_DOWNLOAD_USER_SCOPE,
21
+ "drive:drive",
22
+ "drive:drive:readonly",
23
+ "drive:file",
24
+ "drive:file:readonly",
25
+ ].includes(scope));
26
+ }
17
27
  export const FeishuDocumentAuthorizationBootstrapBodySchema = Type.Object({
18
- profile: Type.Optional(Type.Union([Type.Literal("docx"), Type.Literal("wiki_docx")])),
28
+ profile: Type.Optional(Type.Union([Type.Literal("docx"), Type.Literal("wiki_docx"), Type.Literal("drive_file")])),
19
29
  }, { additionalProperties: false });
20
30
  export const FeishuPlatformStateSchema = Type.String({
21
31
  minLength: FEISHU_PLATFORM_STATE_LENGTH,
@@ -65,6 +75,11 @@ export const FeishuDocumentAuthorizationBootstrapResponseSchema = Type.Object({
65
75
  app_id: Type.String({ minLength: 1, maxLength: 128, pattern: "^cli_[A-Za-z0-9]+$" }),
66
76
  state: FeishuPlatformStateSchema,
67
77
  authorization_scopes: Type.Union([
78
+ Type.Tuple([
79
+ Type.Literal(FEISHU_DOCX_REQUIRED_USER_SCOPE),
80
+ Type.Literal(FEISHU_OFFLINE_ACCESS_SCOPE),
81
+ Type.Literal(FEISHU_DRIVE_DOWNLOAD_USER_SCOPE),
82
+ ]),
68
83
  Type.Tuple([
69
84
  Type.Literal(FEISHU_DOCX_REQUIRED_USER_SCOPE),
70
85
  Type.Literal(FEISHU_OFFLINE_ACCESS_SCOPE),
@@ -400,9 +400,11 @@ export declare const UploadReferenceFileResultSchema: import("@sinclair/typebox"
400
400
  message_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"user_text">, import("@sinclair/typebox").TLiteral<"agent_text">, import("@sinclair/typebox").TLiteral<"system_notice">, import("@sinclair/typebox").TLiteral<"clarification_request">, import("@sinclair/typebox").TLiteral<"clarification_card">]>;
401
401
  body: import("@sinclair/typebox").TString;
402
402
  refs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
403
+ development_operator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TLiteral<true>>;
404
+ external_reference_reads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
403
405
  external_references: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
404
406
  source_ref: import("@sinclair/typebox").TString;
405
- kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
407
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"feishu_docx">, import("@sinclair/typebox").TLiteral<"feishu_drive_file">, import("@sinclair/typebox").TLiteral<"feishu_file">, import("@sinclair/typebox").TLiteral<"feishu_image">]>;
406
408
  name: import("@sinclair/typebox").TString;
407
409
  created_at: import("@sinclair/typebox").TString;
408
410
  }>>>;