@oddington/sdk 0.1.44 → 0.1.45

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.
@@ -6,8 +6,8 @@ export declare const file: import('./routine-definition-types.js').RoutineFileSc
6
6
  export { AIError, RoutineAIError } from '../../../shared/routine-ai-contract.js';
7
7
  export type { RoutineAIOutputIssue } from '../../../shared/routine-ai-output-detail.js';
8
8
  export type { RoutineAIErrorDetail } from '../../../shared/routine-ai-error-detail.js';
9
- export { InboxContractError, asksBlock, continueAsk, defineHandler, fileBlock, question, recordBlock, recordsBlock, resolveAsk, respond, richTextBlock, selection, } from '../../../shared/inbox-contract.js';
10
- export type { AskInput, AuthoredSource, CapturedRecords, DigestInput, Handler, HandlerReference, HandlerRuntime, HandlerTransition, InboxBlock, InboxFile, JsonObject, JsonValue, PresentedField, PresentedRecord, PresentedRecordSummary, PublishedAsk, PublishedDigest, PublishedView, PublicationRequest, Question, QuestionInput, QuestionResponse, RecordCreate, RecordDelete, RecordReference, RecordSource, RecordUpdate, RepositoryCapabilities, RepositoryReceipt, Resolution, ResolutionInput, ResponseDefinition, } from '../../../shared/inbox-contract.js';
9
+ export { InboxContractError, asksBlock, continueAsk, defineHandler, fileBlock, question, recordBlock, recordsBlock, requireRecords, resolveAsk, respond, richTextBlock, selection, } from '../../../shared/inbox-contract.js';
10
+ export type { AskInput, AuthoredSource, CapturedRecords, DigestInput, Handler, HandlerReference, HandlerRuntime, HandlerTransition, InboxBlock, InboxFile, JsonObject, JsonValue, PresentedField, PresentedRecord, PresentedRecordSummary, PublishedAsk, PublishedDigest, PublishedView, PublicationRequest, Question, QuestionInput, QuestionResponse, RecordCreate, RecordDelete, RecordReference, RecordRequirements, RecordSource, RecordUpdate, RepositoryCapabilities, RepositoryReceipt, Resolution, ResolutionInput, ResponseDefinition, } from '../../../shared/inbox-contract.js';
11
11
  export type { CapturedRecordTableInput, RecordField, RecordTableInput, RecordValue, RecordViewInput, TableColumn, ViewRecord, } from '../../../shared/inbox-views.js';
12
12
  export { AirtableOperationError } from '../../../shared/airtable-contract.js';
13
13
  export type { AirtableField, AirtableTable, AirtableRecord, AirtableListInput, AirtableGetInput, AirtableCreateInput, AirtableUpdateInput, AirtableDeleteInput, AirtableReceipt, AirtableWriteResult, AirtableClient } from '../../../shared/airtable-contract.js';
@@ -33,7 +33,7 @@ export { FileOperationError } from '../../../shared/files-contract.js';
33
33
  export { source } from './source.js';
34
34
  export type { SourceLocation, OsSourceLocation, GmailSourceLocation, DropboxSourceLocation, OutlookSourceLocation, SharePointSourceLocation } from './source.js';
35
35
  export { InboxOperationError } from '../../../shared/inbox-member-contract.js';
36
- export type { InboxMember, InboxCurrent, InboxItem, AnswerableQuestion, QuestionSnapshot, ResponseConsequence, LinkedAskSnapshot, AskUpdate, DigestReadConfirmation, RecipientCandidate, RecipientAddition, ResponseAcceptance, InboxAnswerInput, InboxSearchInput } from '../../../shared/inbox-member-types.js';
36
+ export type { InboxMember, InboxCurrent, InboxItem, AnswerableQuestion, QuestionSnapshot, QuestionAvailability, QuestionUnavailableReason, ResponseConsequence, LinkedAskSnapshot, AskUpdate, DigestReadConfirmation, RecipientCandidate, RecipientAddition, ResponseAcceptance, InboxAnswerInput, InboxSearchInput } from '../../../shared/inbox-member-types.js';
37
37
  export type { RecordSelectionResult } from '../../../shared/record-selection.js';
38
38
  export declare const inbox: import('../../../shared/inbox-member-types.js').InboxMember;
39
39
  export type { File, FileInput, FileStorage, FileCreateInput, FileCreateOptions, FileEnrichment, FileEnrichOptions, FileEnrichResult, FileErrorCode, FileErrorDetail } from '../../../shared/files-contract.js';
@@ -0,0 +1,81 @@
1
+ /** Public connection metadata only. No credentials, Vault references, or signers. */
2
+ export type ConnectionProvider = 'github' | 'gmail' | 'airtable' | 'dropbox' | 'outlook' | 'sharepoint';
3
+ export interface ConnectionConfig {
4
+ github: {
5
+ installationId: number;
6
+ accountId: number;
7
+ accountLogin: string;
8
+ };
9
+ gmail: {
10
+ accountEmail: string;
11
+ clientId: string;
12
+ scopes: string[];
13
+ };
14
+ airtable: {
15
+ baseId: string;
16
+ };
17
+ dropbox: {
18
+ accountId: string;
19
+ appKey: string;
20
+ scopes: string[];
21
+ } & DropboxRoot;
22
+ outlook: {
23
+ tenantId: string;
24
+ clientId: string;
25
+ mailboxEmail: string;
26
+ access?: string;
27
+ };
28
+ sharepoint: {
29
+ tenantId: string;
30
+ clientId: string;
31
+ siteUrl: string;
32
+ siteId: string;
33
+ access?: string;
34
+ };
35
+ }
36
+ export type DropboxRoot = {
37
+ access: 'app_folder';
38
+ rootIdentity: string;
39
+ } | {
40
+ access: 'full_dropbox';
41
+ rootPath: string;
42
+ };
43
+ export type DropboxAuthorization = {
44
+ access: 'app_folder';
45
+ } | {
46
+ access: 'full_dropbox';
47
+ rootPath: string;
48
+ };
49
+ /** An explicit existing folder, never the whole account or an ambiguous path. */
50
+ export declare function validDropboxRootPath(value: unknown): value is string;
51
+ export type Connection = {
52
+ [P in ConnectionProvider]: {
53
+ id: string;
54
+ workspaceId: string;
55
+ provider: P;
56
+ name: string;
57
+ config: ConnectionConfig[P];
58
+ enabled: boolean;
59
+ hasCredentials: boolean;
60
+ createdAt: string;
61
+ updatedAt: string;
62
+ };
63
+ }[ConnectionProvider];
64
+ /** Descriptive metadata only; Microsoft grants determine effective authority. */
65
+ export declare function validMicrosoftAccess(value: unknown): value is string;
66
+ /** Entra identifiers are GUID-form strings, including the documented example IDs. */
67
+ export declare function validMicrosoftId(value: unknown): value is string;
68
+ export declare function validMicrosoftMailbox(value: unknown): value is string;
69
+ /** One spelling for saved and verified URLs; refuse ambiguity before URL normalization. */
70
+ export declare function canonicalSharePointSiteUrl(value: unknown): string | undefined;
71
+ export declare function validSharePointSiteId(value: unknown, siteUrl: string): value is string;
72
+ /** Explicit Google scope identifiers, not a permission policy or read-only default. */
73
+ export declare function validGoogleScopes(value: unknown): value is string[];
74
+ export declare function validConnectionConfig(provider: unknown, value: unknown): boolean;
75
+ /** Stable authorization root, independent of the human-visible App Folder name.
76
+ * App Folder mode must come from verified backend app registration, never input
77
+ * from a routine. Account home/team namespace IDs are not App Folder identities. */
78
+ export declare function dropboxAppFolderIdentity(appKey: string, accountId: string): string;
79
+ export declare const DROPBOX_FILE_SCOPES: readonly ['account_info.read', 'files.metadata.read', 'files.content.read', 'files.content.write'];
80
+ export declare function validDropboxFileScopes(value: unknown): value is string[];
81
+ export declare function parseConnectionMetadata(value: unknown): Connection;
@@ -0,0 +1,23 @@
1
+ import { type Connection } from './connections.js';
2
+ import { type RepositoryTarget } from './repository-targets.js';
3
+ /** Private, secret-free Data identity and its current GitHub source authority. */
4
+ export type DataRepositoryBinding = Readonly<{
5
+ id: string;
6
+ workspaceId: string;
7
+ repository: string;
8
+ gitRepository: Readonly<RepositoryTarget>;
9
+ connection: Readonly<Extract<Connection, {
10
+ provider: 'github';
11
+ }> & {
12
+ config: Readonly<Extract<Connection, {
13
+ provider: 'github';
14
+ }>['config']>;
15
+ }>;
16
+ }>;
17
+ export declare function validDataRepositoryName(value: unknown): value is string;
18
+ /** Detach all nested authority before asynchronous work. No caller-selected path. */
19
+ export declare function parseDataRepositoryBinding(value: unknown): DataRepositoryBinding;
20
+ export declare function sameDataRepositoryBinding(a: DataRepositoryBinding, b: DataRepositoryBinding): boolean;
21
+ export declare function dataRepositoryAvailable(binding: DataRepositoryBinding): boolean;
22
+ /** GitHub pilot adapter boundary; compiler helpers may consume derived roots. */
23
+ export declare function dataRepositoryRoots(binding: DataRepositoryBinding): string[];
@@ -1,6 +1,7 @@
1
1
  /** The bounded ask/digest contract. Authorization and durable effects belong to
2
2
  * the server; constructing a value here grants no publication authority. */
3
3
  import { type File } from './files-contract.js';
4
+ import type { RecordIdentity } from './data-contract.js';
4
5
  export type JsonValue = null | boolean | number | string | JsonValue[] | JsonObject;
5
6
  export type JsonObject = {
6
7
  [key: string]: JsonValue;
@@ -54,6 +55,13 @@ export type HandlerReference = {
54
55
  id: string;
55
56
  input: JsonValue;
56
57
  };
58
+ export type RecordRequirements = {
59
+ repository: string;
60
+ records: Array<{
61
+ ref: string;
62
+ version: string;
63
+ }>;
64
+ };
57
65
  export type Question = {
58
66
  id: string;
59
67
  to: string;
@@ -62,6 +70,7 @@ export type Question = {
62
70
  instructions?: string;
63
71
  response: ResponseDefinition;
64
72
  handler?: HandlerReference;
73
+ requirements?: RecordRequirements;
65
74
  };
66
75
  export type QuestionInput = Omit<Question, 'allowedResponders'> & {
67
76
  allowedResponders?: string[];
@@ -151,7 +160,7 @@ export type DigestPublication = DigestInput & {
151
160
  };
152
161
  export type Publication = AskPublication | DigestPublication;
153
162
  export type RecipientPublication = DigestPublication | (Omit<AskPublication, 'questions'> & {
154
- questions: Array<Omit<Question, 'handler'>>;
163
+ questions: Array<Omit<Question, 'handler' | 'requirements'>>;
155
164
  });
156
165
  /** These values are supplied by the verified launch/storage path, never by an
157
166
  * authored item. They are separate from recipient-facing presentation. */
@@ -168,8 +177,8 @@ export type RetainedPublication = {
168
177
  id: string;
169
178
  revision: 1;
170
179
  publisher: PublisherProvenance;
171
- /** Internal retained definition, including private handler input. Never send
172
- * this object directly to a recipient; use recipientPresentation. */
180
+ /** Internal retained definition, including private handler input and requirements.
181
+ * Never send this directly to a recipient; use recipientPresentation. */
173
182
  presentation: Publication;
174
183
  resolvedViews: Array<{
175
184
  id: string;
@@ -325,6 +334,9 @@ export declare function defineHandler<Input extends JsonValue, const Id extends
325
334
  id: Id;
326
335
  };
327
336
  export declare function respond<Input extends JsonValue>(handler: Handler<Input>, input: Input): HandlerReference;
337
+ /** Declare private exact-version guards from ordinary Data results. No Record
338
+ * content or repository snapshot is copied, and this grants no Data authority. */
339
+ export declare function requireRecords(repository: string, records: readonly RecordIdentity[]): RecordRequirements;
328
340
  export declare function question(value: QuestionInput): Question;
329
341
  /** Structural validation is shared. Registered view/handler availability,
330
342
  * people, repository/file access, and provenance MUST be checked by publication too. */
@@ -1,9 +1,20 @@
1
- import type { InboxCurrent, InboxItem, AnswerableQuestion, ResponseAcceptance } from './inbox-member-types.js';
1
+ import type { InboxCurrent, InboxItem, AnswerableQuestion, ResponseAcceptance, QuestionAvailability, QuestionUnavailableReason } from './inbox-member-types.js';
2
2
  export declare class InboxOperationError extends Error {
3
3
  readonly status: number;
4
- readonly reason: 'invalid_input' | 'access_denied' | 'authority_unavailable' | 'conflict' | 'unavailable';
5
- constructor(status: number, reason: 'invalid_input' | 'access_denied' | 'authority_unavailable' | 'conflict' | 'unavailable');
4
+ readonly reason: 'invalid_input' | 'access_denied' | 'authority_unavailable' | 'conflict' | 'unavailable' | QuestionUnavailableReason;
5
+ readonly requirementsRepository?: string | undefined;
6
+ constructor(status: number, reason: 'invalid_input' | 'access_denied' | 'authority_unavailable' | 'conflict' | 'unavailable' | QuestionUnavailableReason, requirementsRepository?: string | undefined);
6
7
  }
8
+ /** Closed recipient-safe state shared by snapshots and refusal transports. */
9
+ export declare function parseQuestionAvailability(value: unknown, available?: boolean): QuestionAvailability;
10
+ export declare function questionAvailability(value: QuestionAvailability, available?: boolean): QuestionAvailability;
11
+ /** Only this exact safe envelope can carry an actionable acceptance refusal. */
12
+ export declare function parseInboxUnavailableFailure(value: unknown, status: number): InboxOperationError | undefined;
13
+ export declare function inboxErrorBody(error: InboxOperationError): {
14
+ error: string;
15
+ unavailableReason?: "access_denied" | "authority_unavailable" | "conflict" | "invalid_input" | "unavailable" | QuestionUnavailableReason | undefined;
16
+ requirementsRepository?: string | undefined;
17
+ };
7
18
  export declare const INBOX_RESULT_BYTES: number;
8
19
  export declare const INBOX_INPUT_BYTES = 8192;
9
20
  /** Includes the exact declaration only on the private CLI-authenticated ingress. */
@@ -23,7 +23,12 @@ export interface ResponseConsequence {
23
23
  needsReconciliation: boolean;
24
24
  reason: string | null;
25
25
  }
26
- export interface QuestionSnapshot {
26
+ export type QuestionUnavailableReason = 'handler_unavailable' | 'records_need_attention' | 'records_unavailable';
27
+ export interface QuestionAvailability {
28
+ unavailableReason?: QuestionUnavailableReason;
29
+ requirementsRepository?: string;
30
+ }
31
+ export interface QuestionSnapshot extends QuestionAvailability {
27
32
  id: string;
28
33
  to: string;
29
34
  prompt: string;
@@ -127,7 +132,7 @@ export interface ResponseAcceptance {
127
132
  label?: string;
128
133
  acceptanceOrder?: number;
129
134
  }
130
- export interface AnswerableQuestion {
135
+ export interface AnswerableQuestion extends QuestionAvailability {
131
136
  itemId: string;
132
137
  /** Parent Ask's workspace-scoped Inbox number, stable across revisions. */
133
138
  number: number;
@@ -1,4 +1,4 @@
1
- import { type RecordSource, type RecordReference } from './inbox-contract.js';
1
+ import { InboxContractError, type RecordSource, type RecordReference } from './inbox-contract.js';
2
2
  export type RecordSelectionInput = {
3
3
  source: RecordSource;
4
4
  query: string;
@@ -18,4 +18,14 @@ export type RecordSelectionResult = {
18
18
  }>;
19
19
  selected?: LabeledRecord;
20
20
  };
21
+ declare const selectionProblems: readonly ['collection_unavailable', 'display_fields_invalid', 'filter_fields_invalid', 'ref_prefix_invalid', 'suggestion_unavailable', 'selected_record_unavailable', 'label_unavailable'];
22
+ export type RecordSelectionProblem = typeof selectionProblems[number];
23
+ export declare function isRecordSelectionProblem(value: unknown): value is RecordSelectionProblem;
24
+ /** Only these known definition failures cross the private Data boundary.
25
+ * Record values, provider errors and credentials never enter the envelope. */
26
+ export declare class RecordSelectionError extends InboxContractError {
27
+ readonly problem: RecordSelectionProblem;
28
+ constructor(problem: RecordSelectionProblem, source: RecordSource);
29
+ }
21
30
  export declare function validateRecordSelectionInput(value: unknown): RecordSelectionInput;
31
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oddington/sdk",
3
- "version": "0.1.44",
3
+ "version": "0.1.45",
4
4
  "description": "OS routine and response-handler SDK",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",