advisers-core 0.0.0-stage → 0.0.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PerryLink contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,20 @@
1
- # Temporary Holding Version
1
+ # advisers-core
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Core types and the in-memory runtime skeleton for **Advisers**:
4
+
5
+ - `Matter` — a dimension on the three ledgers, not a fourth ledger;
6
+ - `Ledger` — user preferences, facts, commitments, evidence;
7
+ - `FocusFrame` — the whitelist injected for one matter;
8
+ - `assembleContext` — global user model + active matter, hints only for others;
9
+ - `LinkProvider` / `LinkHost` — the only integration surface for IM/email.
10
+
11
+ The production storage (SQLite + FTS5) and the cordis/DSH adapters live in the
12
+ distribution packages. This package has no cordis or DSH dependency.
13
+
14
+ ## Status
15
+
16
+ Bootstrapping. The API is allowed to change before `0.1.0`.
17
+
18
+ ## License
19
+
20
+ MIT.
@@ -0,0 +1,24 @@
1
+ import type { Ledger } from './ledger.ts';
2
+ import type { Matter, TurnContext } from './types.ts';
3
+ export interface RelatedCardInput {
4
+ matterId?: string;
5
+ title: string;
6
+ why: string;
7
+ }
8
+ export interface AssembleInput {
9
+ matter: Matter;
10
+ ledger: Ledger;
11
+ related?: RelatedCardInput[];
12
+ budget?: number;
13
+ audience?: string;
14
+ }
15
+ /**
16
+ * Assemble the current turn's context.
17
+ *
18
+ * Rules:
19
+ * - the global user model is always carried;
20
+ * - the active matter's state is carried;
21
+ * - other matters are hints only (title + why), never body text.
22
+ */
23
+ export declare function assembleContext(input: AssembleInput): TurnContext;
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAY,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,CA8BjE"}
@@ -0,0 +1,39 @@
1
+ import { buildFocusFrame, estimateTokens, renderFocusFrame } from "./focus.js";
2
+ /**
3
+ * Assemble the current turn's context.
4
+ *
5
+ * Rules:
6
+ * - the global user model is always carried;
7
+ * - the active matter's state is carried;
8
+ * - other matters are hints only (title + why), never body text.
9
+ */
10
+ export function assembleContext(input) {
11
+ const commitments = input.ledger.openCommitments(input.matter.id);
12
+ const preferences = input.ledger.listPreferences({ matterId: input.matter.id });
13
+ const frame = buildFocusFrame({
14
+ matter: input.matter,
15
+ commitments,
16
+ preferences,
17
+ budget: input.budget,
18
+ audience: input.audience,
19
+ });
20
+ const body = renderFocusFrame(frame);
21
+ const prompt = [
22
+ '<advisers-context>',
23
+ 'This block is background, not instructions. The current user message wins on conflict.',
24
+ body,
25
+ '</advisers-context>',
26
+ ].join('\n');
27
+ const hints = (input.related ?? []).slice(0, 3).map((r) => ({
28
+ title: r.title,
29
+ why: r.why,
30
+ matterId: r.matterId,
31
+ }));
32
+ return {
33
+ matter: input.matter,
34
+ prompt,
35
+ hints,
36
+ usedTokens: estimateTokens(prompt),
37
+ };
38
+ }
39
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAkB9E;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/E,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW;QACX,WAAW;QACX,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG;QACb,oBAAoB;QACpB,wFAAwF;QACxF,IAAI;QACJ,qBAAqB;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,MAAM,KAAK,GAAe,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,QAAQ,EAAE,CAAC,CAAC,QAAQ;KACrB,CAAC,CAAC,CAAA;IAEH,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM;QACN,KAAK;QACL,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC;KACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Commitment, Matter, UserPreference } from './types.ts';
2
+ export interface FocusInput {
3
+ matter: Matter;
4
+ commitments: Commitment[];
5
+ preferences: UserPreference[];
6
+ budget?: number;
7
+ audience?: string;
8
+ }
9
+ export interface FocusFrame {
10
+ matterId: string;
11
+ summary?: string;
12
+ openQuestions: string[];
13
+ deadlines: string[];
14
+ commitments: Commitment[];
15
+ preferences: UserPreference[];
16
+ budget: number;
17
+ audience?: string;
18
+ }
19
+ /**
20
+ * The focus frame is a whitelist, not a retrieval result.
21
+ * It always carries the global user model; it never carries another matter's body.
22
+ */
23
+ export declare function buildFocusFrame(input: FocusInput): FocusFrame;
24
+ export declare function estimateTokens(text: string): number;
25
+ export declare function renderFocusFrame(frame: FocusFrame): string;
26
+ //# sourceMappingURL=focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../src/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAiB7D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA0B1D"}
package/dist/focus.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The focus frame is a whitelist, not a retrieval result.
3
+ * It always carries the global user model; it never carries another matter's body.
4
+ */
5
+ export function buildFocusFrame(input) {
6
+ const budget = input.budget ?? 1200;
7
+ const hard = input.preferences.filter((p) => p.scope.level === 'global' && p.priority === 'hard');
8
+ const rest = input.preferences.filter((p) => p.scope.level === 'global' && p.priority !== 'hard');
9
+ const scoped = input.preferences.filter((p) => p.scope.level === 'matter' && p.scope.value === input.matter.id);
10
+ return {
11
+ matterId: input.matter.id,
12
+ summary: input.matter.summary,
13
+ openQuestions: input.matter.openQuestions.slice(0, 5),
14
+ deadlines: input.matter.deadlines.slice(0, 3),
15
+ commitments: input.commitments.filter((c) => c.status === 'open').slice(0, 5),
16
+ preferences: [...hard, ...scoped, ...rest],
17
+ budget,
18
+ audience: input.audience,
19
+ };
20
+ }
21
+ export function estimateTokens(text) {
22
+ return Math.ceil(text.length / 4);
23
+ }
24
+ export function renderFocusFrame(frame) {
25
+ const lines = [];
26
+ lines.push(`[matter] ${frame.matterId}`);
27
+ if (frame.summary)
28
+ lines.push(`summary: ${frame.summary}`);
29
+ if (frame.openQuestions.length)
30
+ lines.push(`open: ${frame.openQuestions.join(' | ')}`);
31
+ if (frame.deadlines.length)
32
+ lines.push(`deadlines: ${frame.deadlines.join(' | ')}`);
33
+ if (frame.commitments.length) {
34
+ lines.push('commitments: ' +
35
+ frame.commitments
36
+ .map((c) => `${c.debtor} owes ${c.creditor}: ${c.action}${c.dueAt ? ` (${c.dueAt})` : ''}`)
37
+ .join(' | '));
38
+ }
39
+ if (frame.preferences.length) {
40
+ lines.push('preferences:');
41
+ for (const p of frame.preferences)
42
+ lines.push(`- [${p.kind}/${p.priority}] ${p.statement}`);
43
+ }
44
+ let text = lines.join('\n');
45
+ while (estimateTokens(text) > frame.budget && lines.length > 2) {
46
+ // Drop the least critical tail first; hard taboos are ordered first and stay.
47
+ lines.pop();
48
+ text = lines.join('\n');
49
+ }
50
+ return text;
51
+ }
52
+ //# sourceMappingURL=focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.js","sourceRoot":"","sources":["../src/focus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './types.ts';
2
+ export * from './ports.ts';
3
+ export * from './link.ts';
4
+ export * from './ledger.ts';
5
+ export * from './focus.ts';
6
+ export * from './context.ts';
7
+ export * from './runtime.ts';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./types.js";
2
+ export * from "./ports.js";
3
+ export * from "./link.js";
4
+ export * from "./ledger.js";
5
+ export * from "./focus.js";
6
+ export * from "./context.js";
7
+ export * from "./runtime.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
@@ -0,0 +1,69 @@
1
+ import type { HostPorts } from './ports.ts';
2
+ import type { Commitment, CommitmentEvidence, Fact, Id, Matter, PreferenceKind, PreferenceScope, UserPreference } from './types.ts';
3
+ export interface MatterInput {
4
+ title: string;
5
+ domain?: string;
6
+ secrecy?: Matter['secrecy'];
7
+ summary?: string;
8
+ participants?: string[];
9
+ deadlines?: string[];
10
+ openQuestions?: string[];
11
+ }
12
+ export interface FactInput {
13
+ subject: string;
14
+ predicate: string;
15
+ object: string;
16
+ matterId?: Id;
17
+ authority?: Fact['authority'];
18
+ confidence?: number;
19
+ source?: Fact['source'];
20
+ }
21
+ export interface PreferenceInput {
22
+ kind: PreferenceKind;
23
+ statement: string;
24
+ scope?: PreferenceScope;
25
+ source?: UserPreference['source'];
26
+ confidence?: number;
27
+ status?: UserPreference['status'];
28
+ priority?: UserPreference['priority'];
29
+ expiresAt?: string;
30
+ }
31
+ export interface CommitmentInput {
32
+ matterId: Id;
33
+ debtor: Commitment['debtor'];
34
+ creditor: string;
35
+ action: string;
36
+ dueAt?: string;
37
+ timezone?: string;
38
+ capability?: Commitment['capability'];
39
+ evidence: CommitmentEvidence[];
40
+ }
41
+ /**
42
+ * In-memory ledger used by the skeleton and tests.
43
+ * Production storage will be SQLite + FTS5, with this interface.
44
+ */
45
+ export declare class Ledger {
46
+ private readonly clock;
47
+ private readonly ids;
48
+ private readonly matters;
49
+ private readonly facts;
50
+ private readonly commitments;
51
+ private readonly preferences;
52
+ constructor(ports?: HostPorts);
53
+ addMatter(input: MatterInput): Matter;
54
+ getMatter(id: Id): Matter | undefined;
55
+ listMatters(status?: Matter['status']): Matter[];
56
+ remember(input: FactInput): Fact;
57
+ listFacts(matterId?: Id): Fact[];
58
+ addPreference(input: PreferenceInput): UserPreference;
59
+ listPreferences(filter?: {
60
+ matterId?: Id;
61
+ includeCandidates?: boolean;
62
+ }): UserPreference[];
63
+ addCommitment(input: CommitmentInput): Commitment;
64
+ openCommitments(matterId?: Id): Commitment[];
65
+ completeCommitment(id: Id, evidence: CommitmentEvidence[]): Commitment;
66
+ /** Soft delete with a tombstone; never hard-delete user data. */
67
+ forget(kind: 'fact' | 'preference', id: Id): boolean;
68
+ }
69
+ //# sourceMappingURL=ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"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"}
package/dist/ledger.js ADDED
@@ -0,0 +1,144 @@
1
+ import { systemPorts } from "./ports.js";
2
+ /**
3
+ * In-memory ledger used by the skeleton and tests.
4
+ * Production storage will be SQLite + FTS5, with this interface.
5
+ */
6
+ export class Ledger {
7
+ clock;
8
+ ids;
9
+ matters = new Map();
10
+ facts = new Map();
11
+ commitments = new Map();
12
+ preferences = new Map();
13
+ constructor(ports = systemPorts()) {
14
+ this.clock = ports.clock;
15
+ this.ids = ports.ids;
16
+ }
17
+ addMatter(input) {
18
+ const now = this.clock.now();
19
+ const matter = {
20
+ id: this.ids.next('matter'),
21
+ title: input.title,
22
+ status: 'active',
23
+ domain: input.domain ?? 'general',
24
+ secrecy: input.secrecy ?? 0,
25
+ summary: input.summary,
26
+ participants: input.participants ?? [],
27
+ deadlines: input.deadlines ?? [],
28
+ openQuestions: input.openQuestions ?? [],
29
+ createdAt: now,
30
+ updatedAt: now,
31
+ };
32
+ this.matters.set(matter.id, matter);
33
+ return matter;
34
+ }
35
+ getMatter(id) {
36
+ return this.matters.get(id);
37
+ }
38
+ listMatters(status = 'active') {
39
+ return [...this.matters.values()].filter((m) => m.status === status);
40
+ }
41
+ remember(input) {
42
+ const existing = [...this.facts.values()].find((f) => f.status !== 'deleted' &&
43
+ f.subject === input.subject &&
44
+ f.predicate === input.predicate &&
45
+ f.object === input.object);
46
+ if (existing)
47
+ return existing;
48
+ const fact = {
49
+ id: this.ids.next('fact'),
50
+ matterId: input.matterId,
51
+ subject: input.subject,
52
+ predicate: input.predicate,
53
+ object: input.object,
54
+ recordedAt: this.clock.now(),
55
+ authority: input.authority ?? 'user',
56
+ confidence: input.confidence ?? 0.9,
57
+ source: input.source,
58
+ status: 'confirmed',
59
+ };
60
+ this.facts.set(fact.id, fact);
61
+ return fact;
62
+ }
63
+ listFacts(matterId) {
64
+ return [...this.facts.values()].filter((f) => f.status !== 'deleted' && (matterId ? f.matterId === matterId : true));
65
+ }
66
+ addPreference(input) {
67
+ const pref = {
68
+ id: this.ids.next('pref'),
69
+ kind: input.kind,
70
+ statement: input.statement,
71
+ scope: input.scope ?? { level: 'global' },
72
+ source: input.source ?? { type: 'user_explicit' },
73
+ evidence: [],
74
+ confidence: input.confidence ?? 0.9,
75
+ status: input.status ?? 'confirmed',
76
+ validFrom: this.clock.now(),
77
+ expiresAt: input.expiresAt,
78
+ priority: input.priority ?? (input.kind === 'taboo' ? 'hard' : 'soft'),
79
+ };
80
+ this.preferences.set(pref.id, pref);
81
+ return pref;
82
+ }
83
+ listPreferences(filter = {}) {
84
+ return [...this.preferences.values()].filter((p) => {
85
+ if (p.status === 'deprecated')
86
+ return false;
87
+ if (!filter.includeCandidates && p.status !== 'confirmed')
88
+ return false;
89
+ if (p.scope.level === 'global')
90
+ return true;
91
+ if (p.scope.level === 'matter')
92
+ return p.scope.value === filter.matterId;
93
+ return false;
94
+ });
95
+ }
96
+ addCommitment(input) {
97
+ if (input.evidence.length === 0) {
98
+ throw new Error('a commitment requires at least one evidence item');
99
+ }
100
+ const commitment = {
101
+ id: this.ids.next('cm'),
102
+ matterId: input.matterId,
103
+ debtor: input.debtor,
104
+ creditor: input.creditor,
105
+ action: input.action,
106
+ dueAt: input.dueAt,
107
+ timezone: input.timezone ?? 'Asia/Shanghai',
108
+ status: 'open',
109
+ evidence: input.evidence,
110
+ capability: input.capability ?? 'none',
111
+ };
112
+ this.commitments.set(commitment.id, commitment);
113
+ return commitment;
114
+ }
115
+ openCommitments(matterId) {
116
+ return [...this.commitments.values()].filter((c) => c.status === 'open' && (matterId ? c.matterId === matterId : true));
117
+ }
118
+ completeCommitment(id, evidence) {
119
+ if (evidence.length === 0)
120
+ throw new Error('done requires external evidence; model self-report is not evidence');
121
+ const commitment = this.commitments.get(id);
122
+ if (!commitment)
123
+ throw new Error(`unknown commitment: ${id}`);
124
+ commitment.status = 'done';
125
+ commitment.evidence.push(...evidence);
126
+ return commitment;
127
+ }
128
+ /** Soft delete with a tombstone; never hard-delete user data. */
129
+ forget(kind, id) {
130
+ if (kind === 'fact') {
131
+ const fact = this.facts.get(id);
132
+ if (!fact)
133
+ return false;
134
+ fact.status = 'deleted';
135
+ return true;
136
+ }
137
+ const pref = this.preferences.get(id);
138
+ if (!pref)
139
+ return false;
140
+ pref.status = 'deprecated';
141
+ return true;
142
+ }
143
+ }
144
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"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"}
package/dist/link.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ import type { Id } from './types.ts';
2
+ export type AttachmentKind = 'image' | 'file' | 'audio' | 'video';
3
+ export interface Attachment {
4
+ kind: AttachmentKind;
5
+ name?: string;
6
+ url?: string;
7
+ localPath?: string;
8
+ mimeType?: string;
9
+ size?: number;
10
+ }
11
+ export interface LinkCapabilities {
12
+ threads: boolean;
13
+ cards: boolean;
14
+ media: boolean;
15
+ approvals: boolean;
16
+ }
17
+ export interface LinkSender {
18
+ id: string;
19
+ name?: string;
20
+ }
21
+ export interface InboundEvent {
22
+ linkId: string;
23
+ accountId: string;
24
+ conversationId: string;
25
+ threadId?: string;
26
+ messageId: string;
27
+ sender: LinkSender;
28
+ text?: string;
29
+ attachments?: Attachment[];
30
+ quote?: string;
31
+ timestamp: string;
32
+ raw?: unknown;
33
+ }
34
+ export interface LinkHost {
35
+ /** Normalize one inbound event into the runtime. Must be idempotent by messageId. */
36
+ ingest(event: InboundEvent): Promise<void>;
37
+ /** Map a platform account to the runtime principal. */
38
+ resolvePrincipal(account: {
39
+ linkId: string;
40
+ accountId: string;
41
+ }): Promise<Id>;
42
+ }
43
+ export interface DeliveryResult {
44
+ ok: boolean;
45
+ messageId?: string;
46
+ error?: string;
47
+ }
48
+ export interface OutboundMessage {
49
+ conversationId: string;
50
+ threadId?: string;
51
+ text: string;
52
+ cards?: Array<{
53
+ title: string;
54
+ body: string;
55
+ }>;
56
+ attachments?: Attachment[];
57
+ replyTo?: string;
58
+ }
59
+ /**
60
+ * The only integration surface between the core and a transport.
61
+ * Implementations must not be imported by the core.
62
+ */
63
+ export interface LinkProvider {
64
+ id: string;
65
+ capabilities: LinkCapabilities;
66
+ start(host: LinkHost): Promise<void>;
67
+ send(message: OutboundMessage): Promise<DeliveryResult>;
68
+ stop(): Promise<void>;
69
+ }
70
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;AAEjE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,qFAAqF;IACrF,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,uDAAuD;IACvD,gBAAgB,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;CAC9E;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,gBAAgB,CAAA;IAC9B,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IACvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB"}
package/dist/link.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import type { Id, IsoDate } from './types.ts';
2
+ /** Injectable time source; tests can freeze it. */
3
+ export interface Clock {
4
+ now(): IsoDate;
5
+ }
6
+ /** Injectable id source; tests can make ids deterministic. */
7
+ export interface Ids {
8
+ next(prefix: string): Id;
9
+ }
10
+ /** Persistence port. The in-memory skeleton ignores it. */
11
+ export interface Store {
12
+ load(): unknown | undefined;
13
+ save(snapshot: unknown): void;
14
+ }
15
+ /** Optional model port. Without it, a host can print the focus frame instead. */
16
+ export interface ModelPort {
17
+ complete(input: {
18
+ prompt: string;
19
+ }): AsyncIterable<string>;
20
+ }
21
+ /**
22
+ * The only host boundary of the core. The cordis-only and DSH distributions
23
+ * provide their own implementations; core never imports either host.
24
+ */
25
+ export interface HostPorts {
26
+ clock: Clock;
27
+ ids: Ids;
28
+ store?: Store;
29
+ model?: ModelPort;
30
+ }
31
+ export declare function systemPorts(): HostPorts;
32
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE7C,mDAAmD;AACnD,MAAM,WAAW,KAAK;IACpB,GAAG,IAAI,OAAO,CAAA;CACf;AAED,8DAA8D;AAC9D,MAAM,WAAW,GAAG;IAClB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAA;CACzB;AAED,2DAA2D;AAC3D,MAAM,WAAW,KAAK;IACpB,IAAI,IAAI,OAAO,GAAG,SAAS,CAAA;IAC3B,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;CAC9B;AAED,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3D;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,wBAAgB,WAAW,IAAI,SAAS,CAQvC"}
package/dist/ports.js ADDED
@@ -0,0 +1,10 @@
1
+ export function systemPorts() {
2
+ let seq = 0;
3
+ return {
4
+ clock: { now: () => new Date().toISOString() },
5
+ ids: {
6
+ next: (prefix) => `${prefix}_${Date.now().toString(36)}_${++seq}`,
7
+ },
8
+ };
9
+ }
10
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,OAAO;QACL,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QAC9C,GAAG,EAAE;YACH,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;SAClE;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Ledger } from './ledger.ts';
2
+ import type { HostPorts } from './ports.ts';
3
+ import type { InboundEvent, LinkHost, LinkProvider, OutboundMessage, DeliveryResult } from './link.ts';
4
+ import type { TurnContext } from './types.ts';
5
+ export interface AdvisersOptions {
6
+ budget?: number;
7
+ ports?: HostPorts;
8
+ }
9
+ /**
10
+ * Headless runtime. The CLI, the DSH bundle, and every link are adapters.
11
+ * Today the ledger and the reply are in-memory stubs; the interfaces are the point.
12
+ */
13
+ export declare class AdvisersRuntime implements LinkHost {
14
+ readonly ledger: Ledger;
15
+ private readonly links;
16
+ private readonly conversationMatter;
17
+ private readonly budget;
18
+ constructor(options?: AdvisersOptions);
19
+ registerLink(link: LinkProvider): void;
20
+ startLinks(): Promise<void>;
21
+ stopLinks(): Promise<void>;
22
+ resolvePrincipal(account: {
23
+ linkId: string;
24
+ accountId: string;
25
+ }): Promise<string>;
26
+ /**
27
+ * LinkHost.ingest: normalize one inbound event.
28
+ * The real runtime will feed the returned context to the host's LLM.
29
+ */
30
+ ingest(event: InboundEvent): Promise<void>;
31
+ handleInbound(event: InboundEvent): TurnContext;
32
+ send(linkId: string, message: OutboundMessage): Promise<DeliveryResult>;
33
+ }
34
+ export declare function createAdvisers(options?: AdvisersOptions): AdvisersRuntime;
35
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACtG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,OAAO,GAAE,eAAoB;IAKzC,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,gBAAgB,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvF;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW;IA2BzC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAK9E;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,eAAe,CAE7E"}
@@ -0,0 +1,74 @@
1
+ import { assembleContext } from "./context.js";
2
+ import { Ledger } from "./ledger.js";
3
+ /**
4
+ * Headless runtime. The CLI, the DSH bundle, and every link are adapters.
5
+ * Today the ledger and the reply are in-memory stubs; the interfaces are the point.
6
+ */
7
+ export class AdvisersRuntime {
8
+ ledger;
9
+ links = new Map();
10
+ conversationMatter = new Map();
11
+ budget;
12
+ constructor(options = {}) {
13
+ this.budget = options.budget ?? 1200;
14
+ this.ledger = new Ledger(options.ports);
15
+ }
16
+ registerLink(link) {
17
+ if (this.links.has(link.id))
18
+ throw new Error(`link already registered: ${link.id}`);
19
+ this.links.set(link.id, link);
20
+ }
21
+ async startLinks() {
22
+ for (const link of this.links.values())
23
+ await link.start(this);
24
+ }
25
+ async stopLinks() {
26
+ for (const link of this.links.values())
27
+ await link.stop();
28
+ }
29
+ async resolvePrincipal(account) {
30
+ return `${account.linkId}:${account.accountId}`;
31
+ }
32
+ /**
33
+ * LinkHost.ingest: normalize one inbound event.
34
+ * The real runtime will feed the returned context to the host's LLM.
35
+ */
36
+ async ingest(event) {
37
+ this.handleInbound(event);
38
+ }
39
+ handleInbound(event) {
40
+ const key = `${event.linkId}:${event.conversationId}`;
41
+ let matterId = this.conversationMatter.get(key);
42
+ if (!matterId) {
43
+ const matter = this.ledger.addMatter({
44
+ title: event.text?.slice(0, 60) || `conversation ${event.conversationId}`,
45
+ summary: event.text?.slice(0, 200),
46
+ });
47
+ matterId = matter.id;
48
+ this.conversationMatter.set(key, matterId);
49
+ }
50
+ const matter = this.ledger.getMatter(matterId);
51
+ if (!matter)
52
+ throw new Error(`matter disappeared: ${matterId}`);
53
+ if (event.text) {
54
+ this.ledger.remember({
55
+ subject: 'user',
56
+ predicate: 'said',
57
+ object: event.text,
58
+ matterId,
59
+ source: { quote: event.text, ref: event.messageId },
60
+ });
61
+ }
62
+ return assembleContext({ matter, ledger: this.ledger, budget: this.budget });
63
+ }
64
+ async send(linkId, message) {
65
+ const link = this.links.get(linkId);
66
+ if (!link)
67
+ return { ok: false, error: `unknown link: ${linkId}` };
68
+ return link.send(message);
69
+ }
70
+ }
71
+ export function createAdvisers(options = {}) {
72
+ return new AdvisersRuntime(options);
73
+ }
74
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ export type Id = string;
2
+ export type IsoDate = string;
3
+ export type Secrecy = 0 | 1 | 2 | 3;
4
+ export type MatterStatus = 'active' | 'paused' | 'archived';
5
+ /**
6
+ * A matter is a dimension on the three ledgers, not a fourth ledger.
7
+ * Commitments, facts, and decisions point at it; the global user model does not.
8
+ */
9
+ export interface Matter {
10
+ id: Id;
11
+ title: string;
12
+ status: MatterStatus;
13
+ domain: string;
14
+ secrecy: Secrecy;
15
+ summary?: string;
16
+ participants: string[];
17
+ deadlines: IsoDate[];
18
+ openQuestions: string[];
19
+ createdAt: IsoDate;
20
+ updatedAt: IsoDate;
21
+ }
22
+ export type Authority = 'user' | 'tool' | 'inferred';
23
+ export type FactStatus = 'candidate' | 'confirmed' | 'superseded' | 'deleted';
24
+ export interface SourceRef {
25
+ quote?: string;
26
+ ref?: string;
27
+ }
28
+ export interface Fact {
29
+ id: Id;
30
+ matterId?: Id;
31
+ subject: string;
32
+ predicate: string;
33
+ object: string;
34
+ validFrom?: IsoDate;
35
+ validTo?: IsoDate;
36
+ recordedAt: IsoDate;
37
+ authority: Authority;
38
+ confidence: number;
39
+ source?: SourceRef;
40
+ status: FactStatus;
41
+ supersedes?: Id;
42
+ }
43
+ export type Debtor = 'user' | 'agent' | `third:${string}`;
44
+ export type CommitmentStatus = 'open' | 'done' | 'snoozed' | 'dropped';
45
+ export type Capability = 'calendar' | 'todo' | 'none';
46
+ export interface CommitmentEvidence {
47
+ sessionId: string;
48
+ turnId: string;
49
+ quote: string;
50
+ }
51
+ export interface Commitment {
52
+ id: Id;
53
+ matterId: Id;
54
+ debtor: Debtor;
55
+ creditor: string;
56
+ action: string;
57
+ dueAt?: IsoDate;
58
+ timezone: string;
59
+ status: CommitmentStatus;
60
+ evidence: CommitmentEvidence[];
61
+ capability: Capability;
62
+ supersedes?: Id;
63
+ }
64
+ export type PreferenceKind = 'preference' | 'constraint' | 'context' | 'taboo' | 'relationship' | 'goal';
65
+ export type PreferenceSourceType = 'user_explicit' | 'inferred' | 'imported' | 'tool';
66
+ export type PreferenceStatus = 'candidate' | 'confirmed' | 'deprecated';
67
+ export type PreferencePriority = 'hard' | 'soft';
68
+ export interface PreferenceScope {
69
+ level: 'global' | 'project' | 'matter' | 'audience';
70
+ value?: string;
71
+ }
72
+ export interface PreferenceSource {
73
+ type: PreferenceSourceType;
74
+ quote?: string;
75
+ ref?: string;
76
+ }
77
+ export interface UserPreference {
78
+ id: Id;
79
+ kind: PreferenceKind;
80
+ statement: string;
81
+ scope: PreferenceScope;
82
+ source: PreferenceSource;
83
+ evidence: SourceRef[];
84
+ confidence: number;
85
+ status: PreferenceStatus;
86
+ validFrom: IsoDate;
87
+ lastConfirmed?: IsoDate;
88
+ expiresAt?: IsoDate;
89
+ priority: PreferencePriority;
90
+ }
91
+ export interface LinkCard {
92
+ title: string;
93
+ why: string;
94
+ matterId?: Id;
95
+ }
96
+ export interface TurnContext {
97
+ matter: Matter;
98
+ prompt: string;
99
+ hints: LinkCard[];
100
+ usedTokens: number;
101
+ }
102
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "advisers-core",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.0.2",
4
+ "description": "Core types and runtime for Advisers: matters, scoped ledgers, focus frames, and the Link SPI.",
5
+ "keywords": [
6
+ "advisers",
7
+ "cordis",
8
+ "secretary",
9
+ "memory",
10
+ "commitments",
11
+ "link"
12
+ ],
13
+ "author": "PerryLink contributors",
14
+ "license": "MIT",
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "./package.json": "./package.json"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md",
28
+ "LICENSE"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.build.json",
32
+ "typecheck": "tsc -p tsconfig.json --noEmit",
33
+ "test": "node --experimental-strip-types --test test/*.test.ts"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/PerryLink/advisers.git",
38
+ "directory": "packages/core"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ }
43
+ }