@phosphorco/bb-identity 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ import type { NativeSourceEvidence, NativeSourceSnapshot } from './native.js';
2
+ import type { Result } from './model.js';
3
+ /** Source conformance only: caller must obtain producer/live receipts separately. */
4
+ export interface NativeSourceConformanceCase {
5
+ readonly name: string;
6
+ readonly snapshot: NativeSourceSnapshot;
7
+ /** Independent semantic oracle, not an expected value generated by the adapter. */
8
+ readonly verify: (result: Result<NativeSourceEvidence>) => void | Promise<void>;
9
+ }
10
+ export declare function defineNativeSourceConformance(options: {
11
+ readonly test: (name: string, run: () => void | Promise<void>) => unknown;
12
+ /** Drive the adopter's real source path. The kit does not construct an alternate adapter. */
13
+ readonly resolve: (snapshot: NativeSourceSnapshot) => Result<NativeSourceEvidence> | Promise<Result<NativeSourceEvidence>>;
14
+ readonly cases: readonly NativeSourceConformanceCase[];
15
+ }): void;
package/native.d.ts ADDED
@@ -0,0 +1,100 @@
1
+ /** Additive native evidence. Importing existing entries does not require these SDK capabilities. */
2
+ import type { PluginBbSdk } from '@get-bb/plugin-sdk';
3
+ import type { Contribution, EvidencePage, ExecutionProvenance, ExternalPersonSnapshotV1, ProvenanceReader, ReadOptions, Result } from './model.js';
4
+
5
+ export type NativeEvent = Awaited<ReturnType<PluginBbSdk['threads']['events']['list']>>[number];
6
+ export type NativeTimeline = Awaited<ReturnType<PluginBbSdk['threads']['timeline']>>;
7
+ type RequestData = Extract<NativeEvent, { type: 'client/turn/requested' }>['data'];
8
+ /** An absent public SDK property is an absent capability, not a copied fork type. */
9
+ type NativeArrayMember<T, Key extends PropertyKey> = Key extends keyof T
10
+ ? NonNullable<T[Key]> extends readonly (infer Member)[] ? NonNullable<Member> : never
11
+ : never;
12
+ export type NativeActor = NativeArrayMember<RequestData, 'p6rAuthors'>;
13
+ export type NativeMention = NativeArrayMember<RequestData, 'p6rMentionedTargets'>;
14
+ /** Recorded source attribution may also carry the existing shared external-person assertion.
15
+ * This does not add a capability to the consumed SDK or change its NativeActor type. */
16
+ export type NativeSourceActor = NativeActor | ExternalPersonSnapshotV1;
17
+ type NativeRequestEvent = Extract<NativeEvent, { type: 'client/turn/requested' }>;
18
+ /** Package-owned recorded-source seam, derived from the public SDK request shape.
19
+ * Ordinary SDK events remain assignable; richer recorded assertions need this input type. */
20
+ export type NativeSourceEvent = Exclude<NativeEvent, { type: 'client/turn/requested' }> | (
21
+ Omit<NativeRequestEvent, 'data'> & {
22
+ readonly data: Omit<RequestData, 'p6rAuthors' | 'p6rEditors'> & {
23
+ readonly p6rAuthors?: readonly (NativeSourceActor | null)[] | undefined;
24
+ readonly p6rEditors?: readonly (NativeSourceActor | null)[] | undefined;
25
+ };
26
+ }
27
+ );
28
+ export type NativeSourceReference =
29
+ | { readonly kind: 'request-group'; readonly threadId: string; readonly eventId: string; readonly requestId: string; readonly groupIndex: number }
30
+ | { readonly kind: 'event'; readonly threadId: string; readonly eventId: string }
31
+ | { readonly kind: 'assistant-item'; readonly threadId: string; readonly itemId: string; readonly terminalEventId: string; readonly scope: { readonly turnId: string } }
32
+ | { readonly kind: 'assistant-terminal'; readonly threadId: string; readonly terminalEventId: string; readonly scope: { readonly turnId: string } };
33
+ export interface NativeSourceSnapshot {
34
+ readonly source: NativeSourceReference;
35
+ /** Retained public threads.events.list results or recorded-source events. Gaps are not proof of deletion or completeness. */
36
+ readonly events: readonly NativeSourceEvent[];
37
+ /** Public threads.timeline result with content and nested rows requested. No internal projection imports. */
38
+ readonly timeline?: NativeTimeline;
39
+ }
40
+ export interface NativeCoverage {
41
+ readonly status: 'known' | 'partial' | 'unknown';
42
+ readonly reasons: readonly string[];
43
+ }
44
+ export interface NativeInputLink {
45
+ readonly requestEventId: string;
46
+ readonly requestId: string;
47
+ readonly acceptedEventId: string;
48
+ readonly turnId: string;
49
+ readonly groupCount: number;
50
+ }
51
+ export interface NativeTextEvidence {
52
+ readonly text: string;
53
+ readonly basis: 'request-input' | 'public-timeline';
54
+ readonly eventIds: readonly string[];
55
+ readonly sourceSeqStart: number;
56
+ readonly sourceSeqEnd: number;
57
+ readonly itemId: string | null;
58
+ /** Recorded public item parent; null when absent, never inferred delegation. */
59
+ readonly parentToolCallId: string | null;
60
+ readonly timelineRowId: string | null;
61
+ readonly phase: 'commentary' | 'final_answer' | null;
62
+ }
63
+ export interface NativeSourceEvidence {
64
+ readonly source: NativeSourceReference;
65
+ readonly basis: 'public-sdk-native';
66
+ /** Dispatch role does not establish a human identity. Assistant output always remains assistant. */
67
+ readonly origin: 'assistant' | 'agent' | 'user' | 'system' | 'unknown';
68
+ readonly author: NativeSourceActor | null;
69
+ readonly latestEditor: NativeSourceActor | null;
70
+ /** Targets are request-wide: never silently assigned to an individual group. */
71
+ readonly mentionedTargets: readonly NativeMention[];
72
+ readonly dispatch: { readonly initiator: RequestData['initiator']; readonly source: RequestData['source']; readonly senderThreadId: string | null } | null;
73
+ readonly terminal: { readonly terminalEventId: string; readonly scope: { readonly turnId: string }; readonly status: 'completed' | 'failed' | 'interrupted' } | null;
74
+ readonly text: readonly NativeTextEvidence[];
75
+ readonly inputs: readonly NativeInputLink[];
76
+ /** Native input authors, editor, mentions and dispatch do not prove personal lineage or an agent identity. */
77
+ readonly initiatingPerson: { readonly status: 'unknown'; readonly reason: 'not-established-by-native-source' };
78
+ readonly carriedPerson: { readonly status: 'unknown'; readonly reason: 'not-established-by-native-source' };
79
+ readonly agentId: null;
80
+ readonly delegation: { readonly status: 'unknown'; readonly reason: 'not-established-by-native-source' };
81
+ readonly coverage: {
82
+ readonly source: NativeCoverage;
83
+ readonly attribution: NativeCoverage;
84
+ readonly execution: NativeCoverage;
85
+ readonly personalLineage: NativeCoverage;
86
+ };
87
+ /** Each result is the actual reader outcome. Success here never changes native source/lineage coverage. */
88
+ readonly history: readonly NativeHistoryRead[];
89
+ }
90
+ export type NativeHistoryRead =
91
+ | { readonly kind: 'contributions'; readonly eventId: string; readonly result: Result<EvidencePage<Contribution>> }
92
+ | { readonly kind: 'attempts'; readonly contribution: Contribution['reference']; readonly result: Result<EvidencePage<ExecutionProvenance>> };
93
+ export interface NativeSourceAdapter {
94
+ /** Snapshot normalization only. No scans, subscriptions, mutations, or automatic retries. */
95
+ resolve(snapshot: NativeSourceSnapshot): Result<NativeSourceEvidence>;
96
+ /** Optional genuine history reads. Preserves pending/unavailable/partial results and exact causal joins. */
97
+ enrich(evidence: NativeSourceEvidence, options?: ReadOptions): Promise<Result<NativeSourceEvidence>>;
98
+ }
99
+ export declare const NATIVE_SOURCE_LIMITS: Readonly<{ events: 2000; rows: 2000; bytes: 2097152; depth: 8; historyReads: 16; identifier: 256; dataDepth: 64 }>;
100
+ export declare function createNativeSourceAdapter(options?: { readonly history?: ProvenanceReader }): NativeSourceAdapter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phosphorco/bb-identity",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Portable identity, provenance, and state contracts for BB integrations.",
@@ -56,6 +56,18 @@
56
56
  "./react": {
57
57
  "types": "./react.d.ts",
58
58
  "import": "./dist/react-entry-runtime.js"
59
+ },
60
+ "./native": {
61
+ "types": "./native.d.ts",
62
+ "import": "./dist/native-runtime.js"
63
+ },
64
+ "./native/testing": {
65
+ "types": "./native-testing.d.ts",
66
+ "import": "./dist/native-testing-runtime.js"
67
+ },
68
+ "./editing": {
69
+ "types": "./editing.d.ts",
70
+ "import": "./dist/editing-runtime.js"
59
71
  }
60
72
  },
61
73
  "files": [
@@ -70,7 +82,12 @@
70
82
  "bb.d.ts",
71
83
  "react.d.ts",
72
84
  "README.md",
73
- "LICENSE"
85
+ "LICENSE",
86
+ "native.d.ts",
87
+ "native-testing.d.ts",
88
+ "NATIVE-SOURCES.md",
89
+ "editing.d.ts",
90
+ "EDITING.md"
74
91
  ],
75
92
  "publishConfig": {
76
93
  "access": "public"
@@ -102,7 +119,7 @@
102
119
  "typescript": "^5.9.3"
103
120
  },
104
121
  "scripts": {
105
- "build": "bun build index-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build model-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build host-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build server-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build testing-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build bb-entry-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build client-entry-runtime.ts --outdir dist --target browser --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build react-entry-runtime.ts --outdir dist --target browser --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-service-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-controller-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-transport-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\"",
122
+ "build": "bun build index-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build model-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build host-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build server-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build testing-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build bb-entry-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build client-entry-runtime.ts --outdir dist --target browser --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build react-entry-runtime.ts --outdir dist --target browser --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-service-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-controller-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build state-transport-runtime.ts --outdir dist --target bun --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\" && bun build native-runtime.ts native-testing-runtime.ts --outdir dist --target bun --format esm --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"@phosphorco/bb-identity/native\" --external \"zod\" && bun build editing-runtime.ts --outdir dist --target browser --format esm --external \"react\" --external \"react/*\" --external \"react-dom\" --external \"react-dom/*\" --external \"@get-bb/plugin-sdk\" --external \"@get-bb/plugin-sdk/*\" --external \"zod\"",
106
123
  "test": "bun test ./type-tests/*.runtime.test.ts ./type-tests/*.runtime.test.mjs ./type-tests/client-runtime.test.mjs && node --experimental-strip-types --experimental-loader ./type-tests/source-ts-loader.mjs --test ./type-tests/portable-binding-acceptance.node.test.mjs",
107
124
  "typecheck": "tsc --noEmit",
108
125
  "browser-check": "PLAYWRIGHT_BROWSERS_PATH=0 bun ./type-tests/browser/run.mts"
package/react.d.ts CHANGED
@@ -127,3 +127,19 @@ export interface IdentityPreservationFailure {
127
127
  export declare function useIdentityPreservationFailures(): readonly IdentityPreservationFailure[];
128
128
  /** Returns false for an absent or superseded generation; feature code owns retry/recovery. */
129
129
  export declare function useAcknowledgeIdentityPreservationFailure(): (generation: number) => boolean;
130
+
131
+ /** Opt-in editing snapshot; legacy SyncSnapshot never receives new outcomes. */
132
+ export declare function useIdentityEditingBinding<T, Target>(
133
+ options: Omit<import('./editing.js').EditingBindingOptions<T, Target>, 'client' | 'view'>,
134
+ ): import('./editing.js').IdentityEditingBinding<T, Target> | null;
135
+ export declare function useIdentityEditingSnapshot<T, Target>(binding: import('./editing.js').IdentityEditingBinding<T, Target> | null):
136
+ | import('./editing.js').EditingSnapshot<T, Target>
137
+ | { readonly status: 'waiting-for-identity' };
138
+ export interface EditingPreservationFailure {
139
+ readonly generation: number;
140
+ readonly draft: import('./editing.js').EditingDraft<unknown, unknown>;
141
+ readonly error: IdentityError;
142
+ }
143
+ /** Full exportable Target + desired + exact pending request after retirement checkpoint failure. */
144
+ export declare function useIdentityEditingPreservationFailures(): readonly EditingPreservationFailure[];
145
+ export declare function useAcknowledgeIdentityEditingPreservationFailure(): (generation: number) => boolean;