@mono-agent/context 0.1.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.
package/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # @mono-agent/context
2
+
3
+ ## Category
4
+
5
+ Category: `context`
6
+
7
+ ## Responsibility
8
+
9
+ Deterministic context assembly for agent prompts. It loads identity and optional SOUL text, normalizes JSON/Markdown blocks, indexes selected skills, appends recent history, and returns a structured prompt context without calling a model.
10
+
11
+ ## Install / Usage
12
+
13
+ ```bash
14
+ pnpm --filter @mono-agent/context run build
15
+ ```
16
+
17
+ ```ts
18
+ import { buildAgentContext, loadContextFromFiles } from "@mono-agent/context";
19
+ ```
20
+
21
+ Use file loading at host boundaries and `buildAgentContext` for deterministic prompt assembly in tests or harnesses.
22
+
23
+ ## Public API
24
+
25
+ - `buildAgentContext`
26
+ - `loadContextFromFiles`
27
+ - `buildSkillIndex`, `loadSkillIndexFromDirectory`
28
+ - `normalizeJsonValue`
29
+ - `DEFAULT_SOUL_TEXT`, `ContextValidationError`
30
+ - Context, JSON, skill-index, history, and section types
31
+
32
+ ## Dependency Boundary
33
+
34
+ This package is pure TypeScript plus filesystem helpers. It does not depend on runtime execution, adapters, memory persistence, UI, or observability.
35
+
36
+ ## What This Package Does Not Own
37
+
38
+ It does not decide which tools are allowed, run a model, mutate memory, manage conversation transport, or persist run artifacts.
39
+
40
+ ## Verification
41
+
42
+ ```bash
43
+ pnpm --filter @mono-agent/context run build
44
+ pnpm --filter @mono-agent/context run typecheck
45
+ pnpm --filter @mono-agent/context run test
46
+ ```
@@ -0,0 +1,3 @@
1
+ import type { BuildContextInput, BuiltAgentContext } from './types.js';
2
+ export declare function buildAgentContext(input: BuildContextInput): BuiltAgentContext;
3
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../src/context-builder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAOlB,MAAM,YAAY,CAAC;AASpB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAgD7E"}
@@ -0,0 +1,239 @@
1
+ import { DEFAULT_SOUL_TEXT } from './default-soul.js';
2
+ import { ContextValidationError } from './errors.js';
3
+ import { normalizeJsonValue } from './json.js';
4
+ import { buildSkillIndex, renderSkillIndexEntries } from './skill-index.js';
5
+ import { normalizeInlineText } from './text.js';
6
+ const VALID_HISTORY_ROLES = new Set(['system', 'user', 'assistant', 'tool']);
7
+ export function buildAgentContext(input) {
8
+ const rawInput = input;
9
+ if (rawInput === null || typeof rawInput !== 'object') {
10
+ throw new ContextValidationError('invalid_context_block', 'Context input must be an object.');
11
+ }
12
+ const usedDefaultCore = input.core === undefined;
13
+ const core = normalizeContextBlock(input.core === undefined ? DEFAULT_SOUL_TEXT : input.core, 'core');
14
+ const identity = normalizeContextBlock(input.identity, 'identity');
15
+ const memory = normalizeMemory(input.memory);
16
+ const history = normalizeHistory(input.history);
17
+ const skills = input.skills === undefined ? [] : buildSkillIndex(input.skills);
18
+ const skillInstructions = normalizeSkillInstructions(input.skillInstructions);
19
+ const userMessage = normalizeRequiredMarkdown(input.userMessage, 'userMessage');
20
+ const sections = [
21
+ makeSection('core', 'Core Guardrails', core),
22
+ makeSection('identity', 'Identity', identity),
23
+ ];
24
+ if (memory.length > 0) {
25
+ sections.push(makeSection('memory', 'Memory', renderNumberedBlocks(memory, 'Memory')));
26
+ }
27
+ if (history.length > 0) {
28
+ sections.push(makeSection('history', 'Conversation History', renderHistory(history)));
29
+ }
30
+ if (skills.length > 0) {
31
+ sections.push(makeSection('skills', 'Skill Index', { content: renderSkillIndexEntries(skills) }));
32
+ }
33
+ if (skillInstructions.length > 0) {
34
+ sections.push(makeSection('skill-instructions', 'Selected Skill Instructions', renderNumberedBlocks(skillInstructions, 'Skill Instruction')));
35
+ }
36
+ sections.push(makeSection('user-message', 'Current User Message', { content: userMessage }));
37
+ return {
38
+ prompt: sections.map(renderSection).join('\n\n'),
39
+ sections,
40
+ metadata: {
41
+ usedDefaultCore,
42
+ skillCount: skills.length,
43
+ historyCount: history.length,
44
+ sources: collectSources(core, identity, memory, skills, skillInstructions),
45
+ },
46
+ };
47
+ }
48
+ function normalizeMemory(memory) {
49
+ if (memory === undefined) {
50
+ return [];
51
+ }
52
+ const blocks = Array.isArray(memory) ? memory : [memory];
53
+ return blocks.map((block, index) => normalizeContextBlock(block, `memory[${index}]`));
54
+ }
55
+ function normalizeSkillInstructions(skillInstructions) {
56
+ if (skillInstructions === undefined) {
57
+ return [];
58
+ }
59
+ const blocks = Array.isArray(skillInstructions) ? skillInstructions : [skillInstructions];
60
+ return blocks.map((block, index) => normalizeContextBlock(block, `skillInstructions[${index}]`));
61
+ }
62
+ function normalizeHistory(history) {
63
+ if (history === undefined) {
64
+ return [];
65
+ }
66
+ if (!Array.isArray(history)) {
67
+ throw new ContextValidationError('invalid_history', 'History must be an ordered array of messages.');
68
+ }
69
+ return history.map((message, index) => {
70
+ const raw = message;
71
+ if (raw === null || typeof raw !== 'object') {
72
+ throw new ContextValidationError('invalid_history', 'History messages must be objects.', { index });
73
+ }
74
+ const role = raw.role;
75
+ if (typeof role !== 'string' || !VALID_HISTORY_ROLES.has(role)) {
76
+ throw new ContextValidationError('invalid_history', 'History message role is invalid.', {
77
+ index,
78
+ role,
79
+ });
80
+ }
81
+ const content = normalizeRequiredMarkdown(raw.content, `history[${index}].content`);
82
+ const normalized = {
83
+ role: role,
84
+ content,
85
+ };
86
+ if (raw.name !== undefined) {
87
+ normalized.name = normalizeOptionalInlineString(raw.name, `history[${index}].name`);
88
+ }
89
+ if (raw.timestamp !== undefined) {
90
+ normalized.timestamp = normalizeOptionalInlineString(raw.timestamp, `history[${index}].timestamp`);
91
+ }
92
+ return normalized;
93
+ });
94
+ }
95
+ function normalizeContextBlock(block, label) {
96
+ if (typeof block === 'string') {
97
+ return { content: normalizeRequiredMarkdown(block, label) };
98
+ }
99
+ const raw = block;
100
+ if (raw === null || typeof raw !== 'object') {
101
+ throw new ContextValidationError('invalid_context_block', 'Context blocks must be strings or typed block objects.', {
102
+ label,
103
+ });
104
+ }
105
+ if (raw.kind === 'markdown') {
106
+ return withOptionalSource({ content: normalizeRequiredMarkdown(raw.content, `${label}.content`) }, raw.source, label);
107
+ }
108
+ if (raw.kind === 'json') {
109
+ const normalizedJson = normalizeJsonValue(raw.value);
110
+ return withOptionalSource({ content: `\`\`\`json\n${JSON.stringify(normalizedJson, null, 2)}\n\`\`\`` }, raw.source, label);
111
+ }
112
+ throw new ContextValidationError('invalid_context_block', 'Context block kind must be markdown or json.', {
113
+ label,
114
+ kind: raw.kind,
115
+ });
116
+ }
117
+ function withOptionalSource(block, rawSource, label) {
118
+ if (rawSource === undefined) {
119
+ return block;
120
+ }
121
+ if (typeof rawSource !== 'string') {
122
+ throw new ContextValidationError('invalid_context_block', 'Context block source must be a string when provided.', {
123
+ label,
124
+ });
125
+ }
126
+ const source = rawSource.trim();
127
+ if (source.length === 0) {
128
+ throw new ContextValidationError('invalid_context_block', 'Context block source must not be empty.', {
129
+ label,
130
+ });
131
+ }
132
+ return {
133
+ ...block,
134
+ source,
135
+ };
136
+ }
137
+ function normalizeRequiredMarkdown(value, field) {
138
+ if (typeof value !== 'string') {
139
+ throw new ContextValidationError('empty_required_field', `${field} must be a string.`, {
140
+ field,
141
+ });
142
+ }
143
+ const normalized = normalizeMarkdown(value);
144
+ if (normalized.length === 0) {
145
+ throw new ContextValidationError('empty_required_field', `${field} must not be empty.`, {
146
+ field,
147
+ });
148
+ }
149
+ return normalized;
150
+ }
151
+ function normalizeMarkdown(value) {
152
+ return value.replace(/\r\n?/g, '\n').trim();
153
+ }
154
+ function normalizeOptionalInlineString(value, field) {
155
+ if (typeof value !== 'string') {
156
+ throw new ContextValidationError('invalid_history', `${field} must be a string when provided.`, {
157
+ field,
158
+ });
159
+ }
160
+ const normalized = normalizeInlineText(value);
161
+ if (normalized.length === 0) {
162
+ throw new ContextValidationError('invalid_history', `${field} must not be empty when provided.`, {
163
+ field,
164
+ });
165
+ }
166
+ return normalized;
167
+ }
168
+ function makeSection(id, title, block) {
169
+ const section = {
170
+ id,
171
+ title,
172
+ content: block.content,
173
+ };
174
+ if (block.source === undefined) {
175
+ return section;
176
+ }
177
+ return {
178
+ ...section,
179
+ source: block.source,
180
+ };
181
+ }
182
+ function renderSection(section) {
183
+ return `## ${section.title}\n\n${section.content}`;
184
+ }
185
+ function renderNumberedBlocks(blocks, label) {
186
+ if (blocks.length === 1) {
187
+ const [onlyBlock] = blocks;
188
+ if (onlyBlock === undefined) {
189
+ throw new ContextValidationError('invalid_context_block', `${label} block is unexpectedly missing.`);
190
+ }
191
+ return onlyBlock;
192
+ }
193
+ return {
194
+ content: blocks
195
+ .map((block, index) => {
196
+ const sourceSuffix = block.source === undefined ? '' : ` (${block.source})`;
197
+ return `### ${label} ${index + 1}${sourceSuffix}\n\n${block.content}`;
198
+ })
199
+ .join('\n\n'),
200
+ };
201
+ }
202
+ function renderHistory(history) {
203
+ return {
204
+ content: history
205
+ .map((message, index) => {
206
+ const labelParts = [`${index + 1}. ${message.role}`];
207
+ if (message.name !== undefined) {
208
+ labelParts.push(message.name);
209
+ }
210
+ if (message.timestamp !== undefined) {
211
+ labelParts.push(message.timestamp);
212
+ }
213
+ return `### ${labelParts.join(' — ')}\n\n${message.content}`;
214
+ })
215
+ .join('\n\n'),
216
+ };
217
+ }
218
+ function collectSources(core, identity, memory, skills, skillInstructions) {
219
+ const sources = [];
220
+ addSource(sources, core.source);
221
+ addSource(sources, identity.source);
222
+ for (const block of memory) {
223
+ addSource(sources, block.source);
224
+ }
225
+ for (const skill of skills) {
226
+ addSource(sources, skill.mainFile);
227
+ }
228
+ for (const block of skillInstructions) {
229
+ addSource(sources, block.source);
230
+ }
231
+ return sources;
232
+ }
233
+ function addSource(sources, source) {
234
+ if (source === undefined || sources.includes(source)) {
235
+ return;
236
+ }
237
+ sources.push(source);
238
+ }
239
+ //# sourceMappingURL=context-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../src/context-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const DEFAULT_SOUL_TEXT = "You are a careful, source-grounded agent.\n\nCore guardrails:\n- Follow the instruction hierarchy and project-local guidance before making changes.\n- Read and research the current context before acting; distinguish confirmed facts from assumptions.\n- Keep scope small, reversible, and aligned with the user's requested outcome.\n- Preserve secrets and never expose credentials, tokens, or private local configuration.\n- Do not fake success, readiness, tests, data sources, or product behavior.\n- Surface model, runtime, provider, and tool failures honestly instead of hiding them behind broad fallbacks.\n- Ask for clarification when missing information would change the implementation or outcome.\n- Leave clear handoff notes with decisions, verification, and remaining risks.";
2
+ //# sourceMappingURL=default-soul.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-soul.d.ts","sourceRoot":"","sources":["../src/default-soul.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,kxBAUiD,CAAC"}
@@ -0,0 +1,12 @@
1
+ export const DEFAULT_SOUL_TEXT = `You are a careful, source-grounded agent.
2
+
3
+ Core guardrails:
4
+ - Follow the instruction hierarchy and project-local guidance before making changes.
5
+ - Read and research the current context before acting; distinguish confirmed facts from assumptions.
6
+ - Keep scope small, reversible, and aligned with the user's requested outcome.
7
+ - Preserve secrets and never expose credentials, tokens, or private local configuration.
8
+ - Do not fake success, readiness, tests, data sources, or product behavior.
9
+ - Surface model, runtime, provider, and tool failures honestly instead of hiding them behind broad fallbacks.
10
+ - Ask for clarification when missing information would change the implementation or outcome.
11
+ - Leave clear handoff notes with decisions, verification, and remaining risks.`;
12
+ //# sourceMappingURL=default-soul.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-soul.js","sourceRoot":"","sources":["../src/default-soul.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;+EAU8C,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type ContextValidationErrorCode = 'empty_required_field' | 'invalid_context_block' | 'invalid_history' | 'invalid_json' | 'invalid_skill_index' | 'file_read_failed';
2
+ export interface ContextValidationErrorDetails {
3
+ readonly [key: string]: unknown;
4
+ }
5
+ export declare class ContextValidationError extends Error {
6
+ readonly code: ContextValidationErrorCode;
7
+ readonly details: ContextValidationErrorDetails;
8
+ constructor(code: ContextValidationErrorCode, message: string, details?: ContextValidationErrorDetails);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAClC,sBAAsB,GACtB,uBAAuB,GACvB,iBAAiB,GACjB,cAAc,GACd,qBAAqB,GACrB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;gBAG9C,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,6BAAkC;CAO9C"}
package/dist/errors.js ADDED
@@ -0,0 +1,11 @@
1
+ export class ContextValidationError extends Error {
2
+ code;
3
+ details;
4
+ constructor(code, message, details = {}) {
5
+ super(message);
6
+ this.name = 'ContextValidationError';
7
+ this.code = code;
8
+ this.details = { ...details, code };
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,IAAI,CAA6B;IACjC,OAAO,CAAgC;IAEhD,YACE,IAAgC,EAChC,OAAe,EACf,UAAyC,EAAE;QAE3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { BuiltAgentContext, FileContextInput } from './types.js';
2
+ export declare function loadContextFromFiles(input: FileContextInput): Promise<BuiltAgentContext>;
3
+ //# sourceMappingURL=file-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-loader.d.ts","sourceRoot":"","sources":["../src/file-loader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAqB,iBAAiB,EAAE,gBAAgB,EAAyC,MAAM,YAAY,CAAC;AAEhI,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqB9F"}
@@ -0,0 +1,49 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { buildAgentContext } from './context-builder.js';
3
+ import { ContextValidationError } from './errors.js';
4
+ import { resolveRequiredPath } from './fs-paths.js';
5
+ import { buildSkillIndex, loadSkillIndexFromDirectory } from './skill-index.js';
6
+ export async function loadContextFromFiles(input) {
7
+ const rawInput = input;
8
+ if (rawInput === null || typeof rawInput !== 'object') {
9
+ throw new ContextValidationError('invalid_context_block', 'File context input must be an object.');
10
+ }
11
+ const identity = await readMarkdownFile(input.identityPath, 'identityPath');
12
+ const core = input.soulPath === undefined ? undefined : await readMarkdownFile(input.soulPath, 'soulPath');
13
+ const skills = await loadMergedSkillIndex(input);
14
+ const buildInput = {
15
+ identity,
16
+ userMessage: input.userMessage,
17
+ ...(core === undefined ? {} : { core }),
18
+ ...(input.memory === undefined ? {} : { memory: input.memory }),
19
+ ...(input.history === undefined ? {} : { history: input.history }),
20
+ ...(skills.length === 0 ? {} : { skills }),
21
+ ...(input.skillInstructions === undefined ? {} : { skillInstructions: input.skillInstructions }),
22
+ };
23
+ return buildAgentContext(buildInput);
24
+ }
25
+ async function loadMergedSkillIndex(input) {
26
+ const discovered = input.skillsRoot === undefined ? [] : await loadSkillIndexFromDirectory(input.skillsRoot);
27
+ const explicit = input.skills ?? [];
28
+ if (explicit.length === 0 && discovered.length === 0) {
29
+ return [];
30
+ }
31
+ return buildSkillIndex([...explicit, ...discovered]);
32
+ }
33
+ async function readMarkdownFile(filePath, field) {
34
+ const resolvedPath = resolveRequiredPath(filePath, field);
35
+ try {
36
+ return {
37
+ kind: 'markdown',
38
+ content: await readFile(resolvedPath, 'utf8'),
39
+ source: resolvedPath,
40
+ };
41
+ }
42
+ catch (error) {
43
+ throw new ContextValidationError('file_read_failed', `Unable to read ${field}.`, {
44
+ path: resolvedPath,
45
+ cause: error instanceof Error ? error.message : String(error),
46
+ });
47
+ }
48
+ }
49
+ //# sourceMappingURL=file-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-loader.js","sourceRoot":"","sources":["../src/file-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ContextValidationError } from './errors.js';
2
+ export declare function resolveRequiredPath(value: string, field: string): string;
3
+ export declare function fileReadError(message: string, filePath: string, error: unknown): ContextValidationError;
4
+ //# sourceMappingURL=fs-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-paths.d.ts","sourceRoot":"","sources":["../src/fs-paths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAKvG"}
@@ -0,0 +1,17 @@
1
+ import { resolve } from 'node:path';
2
+ import { ContextValidationError } from './errors.js';
3
+ export function resolveRequiredPath(value, field) {
4
+ if (typeof value !== 'string' || value.trim().length === 0) {
5
+ throw new ContextValidationError('file_read_failed', `${field} must be a non-empty path.`, {
6
+ field,
7
+ });
8
+ }
9
+ return resolve(value);
10
+ }
11
+ export function fileReadError(message, filePath, error) {
12
+ return new ContextValidationError('file_read_failed', message, {
13
+ path: filePath,
14
+ cause: error instanceof Error ? error.message : String(error),
15
+ });
16
+ }
17
+ //# sourceMappingURL=fs-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-paths.js","sourceRoot":"","sources":["../src/fs-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,sBAAsB,CAAC,kBAAkB,EAAE,GAAG,KAAK,4BAA4B,EAAE;YACzF,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,QAAgB,EAAE,KAAc;IAC7E,OAAO,IAAI,sBAAsB,CAAC,kBAAkB,EAAE,OAAO,EAAE;QAC7D,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAC9D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { buildAgentContext } from './context-builder.js';
2
+ export { DEFAULT_SOUL_TEXT } from './default-soul.js';
3
+ export { ContextValidationError } from './errors.js';
4
+ export type { ContextValidationErrorCode, ContextValidationErrorDetails } from './errors.js';
5
+ export { loadContextFromFiles } from './file-loader.js';
6
+ export { buildSkillIndex, loadSkillFilesFromDirectory, loadSkillIndexFromDirectory } from './skill-index.js';
7
+ export type { LoadedSkillFile } from './skill-index.js';
8
+ export { normalizeInlineText } from './text.js';
9
+ export type { BuildContextInput, BuiltAgentContext, ContextBlockInput, ContextRole, ContextSection, ContextSectionId, FileContextInput, HistoryMessage, MarkdownContextBlock, SkillIndexEntry, } from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC7G,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { buildAgentContext } from './context-builder.js';
2
+ export { DEFAULT_SOUL_TEXT } from './default-soul.js';
3
+ export { ContextValidationError } from './errors.js';
4
+ export { loadContextFromFiles } from './file-loader.js';
5
+ export { buildSkillIndex, loadSkillFilesFromDirectory, loadSkillIndexFromDirectory } from './skill-index.js';
6
+ export { normalizeInlineText } from './text.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE7G,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
package/dist/json.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonObject = {
3
+ readonly [key: string]: JsonValue;
4
+ };
5
+ export type JsonArray = readonly JsonValue[];
6
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
7
+ export declare function normalizeJsonValue(value: unknown): JsonValue;
8
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,SAAS,GAAG,SAAS,SAAS,EAAE,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAE5D"}
package/dist/json.js ADDED
@@ -0,0 +1,79 @@
1
+ import { ContextValidationError } from './errors.js';
2
+ export function normalizeJsonValue(value) {
3
+ return normalizeJsonValueAtPath(value, '$', new WeakSet());
4
+ }
5
+ function normalizeJsonValueAtPath(value, path, stack) {
6
+ if (value === null) {
7
+ return null;
8
+ }
9
+ switch (typeof value) {
10
+ case 'string':
11
+ case 'boolean':
12
+ return value;
13
+ case 'number':
14
+ if (!Number.isFinite(value)) {
15
+ throw new ContextValidationError('invalid_json', 'JSON values must use finite numbers.', {
16
+ path,
17
+ value,
18
+ });
19
+ }
20
+ return value;
21
+ case 'object':
22
+ return normalizeJsonObjectOrArray(value, path, stack);
23
+ case 'undefined':
24
+ case 'function':
25
+ case 'symbol':
26
+ case 'bigint':
27
+ throw new ContextValidationError('invalid_json', `Unsupported JSON value at ${path}.`, {
28
+ path,
29
+ valueType: typeof value,
30
+ });
31
+ }
32
+ throw new ContextValidationError('invalid_json', `Unsupported JSON value at ${path}.`, {
33
+ path,
34
+ valueType: typeof value,
35
+ });
36
+ }
37
+ function normalizeJsonObjectOrArray(value, path, stack) {
38
+ if (stack.has(value)) {
39
+ throw new ContextValidationError('invalid_json', 'Circular JSON values are not supported.', {
40
+ path,
41
+ });
42
+ }
43
+ stack.add(value);
44
+ try {
45
+ if (Array.isArray(value)) {
46
+ const normalizedItems = [];
47
+ for (let index = 0; index < value.length; index += 1) {
48
+ if (!Object.prototype.hasOwnProperty.call(value, index)) {
49
+ throw new ContextValidationError('invalid_json', 'Sparse arrays are not valid JSON values.', {
50
+ path: `${path}[${index}]`,
51
+ });
52
+ }
53
+ normalizedItems.push(normalizeJsonValueAtPath(value[index], `${path}[${index}]`, stack));
54
+ }
55
+ return normalizedItems;
56
+ }
57
+ if (!isPlainObject(value)) {
58
+ throw new ContextValidationError('invalid_json', 'JSON objects must be plain objects.', {
59
+ path,
60
+ objectType: Object.prototype.toString.call(value),
61
+ });
62
+ }
63
+ const normalized = {};
64
+ const keys = Object.keys(value).sort();
65
+ for (const key of keys) {
66
+ const propertyValue = value[key];
67
+ normalized[key] = normalizeJsonValueAtPath(propertyValue, `${path}.${key}`, stack);
68
+ }
69
+ return normalized;
70
+ }
71
+ finally {
72
+ stack.delete(value);
73
+ }
74
+ }
75
+ function isPlainObject(value) {
76
+ const prototype = Object.getPrototypeOf(value);
77
+ return prototype === Object.prototype || prototype === null;
78
+ }
79
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SkillIndexEntry } from './types.js';
2
+ export interface LoadedSkillFile {
3
+ readonly entry: SkillIndexEntry;
4
+ readonly markdown: string;
5
+ }
6
+ export declare function buildSkillIndex(entries: readonly SkillIndexEntry[]): readonly SkillIndexEntry[];
7
+ export declare function loadSkillIndexFromDirectory(root: string): Promise<readonly SkillIndexEntry[]>;
8
+ export declare function loadSkillFilesFromDirectory(root: string): Promise<readonly LoadedSkillFile[]>;
9
+ export declare function renderSkillIndex(entries: readonly SkillIndexEntry[]): string;
10
+ export declare function renderSkillIndexEntries(entries: readonly SkillIndexEntry[]): string;
11
+ //# sourceMappingURL=skill-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-index.d.ts","sourceRoot":"","sources":["../src/skill-index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,eAAe,EAAE,CAkB/F;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAGnG;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAiDnG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAE5E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAInF"}
@@ -0,0 +1,165 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { ContextValidationError } from './errors.js';
4
+ import { fileReadError, resolveRequiredPath } from './fs-paths.js';
5
+ import { normalizeInlineText } from './text.js';
6
+ export function buildSkillIndex(entries) {
7
+ const normalized = entries.map((entry, index) => normalizeSkillEntry(entry, index));
8
+ const seen = new Map();
9
+ for (const entry of normalized) {
10
+ const key = entry.name.toLowerCase();
11
+ const existing = seen.get(key);
12
+ if (existing !== undefined) {
13
+ throw new ContextValidationError('invalid_skill_index', 'Duplicate skill names are not allowed.', {
14
+ name: entry.name,
15
+ existing: existing.mainFile,
16
+ duplicate: entry.mainFile,
17
+ });
18
+ }
19
+ seen.set(key, entry);
20
+ }
21
+ return [...normalized].sort(compareSkillEntries);
22
+ }
23
+ export async function loadSkillIndexFromDirectory(root) {
24
+ const files = await loadSkillFilesFromDirectory(root);
25
+ return files.map((file) => file.entry);
26
+ }
27
+ export async function loadSkillFilesFromDirectory(root) {
28
+ const rootPath = resolveRequiredPath(root, 'skillsRoot');
29
+ let entries;
30
+ try {
31
+ entries = await readdir(rootPath, { withFileTypes: true });
32
+ }
33
+ catch (error) {
34
+ throw fileReadError('Unable to read skills directory.', rootPath, error);
35
+ }
36
+ const discovered = [];
37
+ const markdownByMainFile = new Map();
38
+ const childDirectories = entries
39
+ .filter((entry) => entry.isDirectory())
40
+ .map((entry) => entry.name)
41
+ .sort();
42
+ for (const childName of childDirectories) {
43
+ const skillFile = join(rootPath, childName, 'SKILL.md');
44
+ let markdown;
45
+ try {
46
+ markdown = await readFile(skillFile, 'utf8');
47
+ }
48
+ catch (error) {
49
+ if (isErrorWithCode(error, 'ENOENT')) {
50
+ continue;
51
+ }
52
+ throw fileReadError('Unable to read skill file.', skillFile, error);
53
+ }
54
+ const description = deriveSkillDescription(markdown);
55
+ if (description.length === 0) {
56
+ throw new ContextValidationError('invalid_skill_index', 'Skill file must contain a non-heading description paragraph.', {
57
+ mainFile: skillFile,
58
+ name: childName,
59
+ });
60
+ }
61
+ discovered.push({
62
+ name: childName,
63
+ description,
64
+ mainFile: skillFile,
65
+ });
66
+ markdownByMainFile.set(skillFile, markdown);
67
+ }
68
+ const index = buildSkillIndex(discovered);
69
+ return index.map((entry) => ({
70
+ entry,
71
+ markdown: markdownByMainFile.get(entry.mainFile) ?? '',
72
+ }));
73
+ }
74
+ export function renderSkillIndex(entries) {
75
+ return renderSkillIndexEntries(buildSkillIndex(entries));
76
+ }
77
+ export function renderSkillIndexEntries(entries) {
78
+ return entries
79
+ .map((entry) => `- **${entry.name}** — ${entry.description}\n - Main file: \`${entry.mainFile}\``)
80
+ .join('\n');
81
+ }
82
+ function normalizeSkillEntry(entry, index) {
83
+ const raw = entry;
84
+ if (raw === null || typeof raw !== 'object') {
85
+ throw new ContextValidationError('invalid_skill_index', 'Skill entries must be objects.', {
86
+ index,
87
+ });
88
+ }
89
+ return {
90
+ name: normalizeRequiredInlineString(raw.name, 'name', index),
91
+ description: normalizeRequiredInlineString(raw.description, 'description', index),
92
+ mainFile: normalizeRequiredInlineString(raw.mainFile, 'mainFile', index),
93
+ };
94
+ }
95
+ function normalizeRequiredInlineString(value, field, index) {
96
+ if (typeof value !== 'string') {
97
+ throw new ContextValidationError('invalid_skill_index', `Skill ${field} must be a string.`, {
98
+ field,
99
+ index,
100
+ });
101
+ }
102
+ const normalized = normalizeInlineText(value);
103
+ if (normalized.length === 0) {
104
+ throw new ContextValidationError('invalid_skill_index', `Skill ${field} must not be empty.`, {
105
+ field,
106
+ index,
107
+ });
108
+ }
109
+ return normalized;
110
+ }
111
+ function compareSkillEntries(left, right) {
112
+ const leftKey = left.name.toLowerCase();
113
+ const rightKey = right.name.toLowerCase();
114
+ if (leftKey < rightKey) {
115
+ return -1;
116
+ }
117
+ if (leftKey > rightKey) {
118
+ return 1;
119
+ }
120
+ if (left.name < right.name) {
121
+ return -1;
122
+ }
123
+ if (left.name > right.name) {
124
+ return 1;
125
+ }
126
+ return 0;
127
+ }
128
+ function deriveSkillDescription(markdown) {
129
+ const paragraphs = [];
130
+ let currentParagraph = [];
131
+ const flush = () => {
132
+ if (currentParagraph.length > 0) {
133
+ paragraphs.push(normalizeInlineText(currentParagraph.join(' ')));
134
+ currentParagraph = [];
135
+ }
136
+ };
137
+ for (const rawLine of stripFrontmatter(markdown).replace(/\r\n?/g, '\n').split('\n')) {
138
+ const line = rawLine.trim();
139
+ if (line.length === 0) {
140
+ flush();
141
+ continue;
142
+ }
143
+ if (/^#{1,6}\s+/.test(line)) {
144
+ flush();
145
+ continue;
146
+ }
147
+ currentParagraph.push(line);
148
+ }
149
+ flush();
150
+ return paragraphs.find((paragraph) => paragraph.length > 0) ?? '';
151
+ }
152
+ /**
153
+ * Skill files shared with other harnesses (e.g. Claude Code) open with a YAML
154
+ * frontmatter block. The block is metadata, not prose, so the derived
155
+ * description starts after it.
156
+ */
157
+ function stripFrontmatter(markdown) {
158
+ const normalized = markdown.replace(/\r\n?/g, '\n');
159
+ const match = /^---\n[\s\S]*?\n---[ \t]*(?:\n|$)/u.exec(normalized);
160
+ return match === null ? normalized : normalized.slice(match[0].length);
161
+ }
162
+ function isErrorWithCode(error, code) {
163
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === code;
164
+ }
165
+ //# sourceMappingURL=skill-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-index.js","sourceRoot":"","sources":["../src/skill-index.ts"],"names":[],"mappings":"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"}
package/dist/text.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function normalizeInlineText(value: string): string;
2
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOzD"}
package/dist/text.js ADDED
@@ -0,0 +1,9 @@
1
+ export function normalizeInlineText(value) {
2
+ return value
3
+ .replace(/\r\n?/g, '\n')
4
+ .split('\n')
5
+ .map((line) => line.trim())
6
+ .filter(Boolean)
7
+ .join(' ');
8
+ }
9
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,KAAK;SACT,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;SACvB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { JsonValue } from './json.js';
2
+ export type ContextRole = 'system' | 'user' | 'assistant' | 'tool';
3
+ export interface MarkdownContextBlock {
4
+ readonly kind: 'markdown';
5
+ readonly content: string;
6
+ readonly source?: string;
7
+ }
8
+ export interface JsonContextBlock {
9
+ readonly kind: 'json';
10
+ readonly value: JsonValue;
11
+ readonly source?: string;
12
+ }
13
+ export type ContextBlockInput = string | MarkdownContextBlock | JsonContextBlock;
14
+ export interface HistoryMessage {
15
+ readonly role: ContextRole;
16
+ readonly content: string;
17
+ readonly name?: string;
18
+ readonly timestamp?: string;
19
+ }
20
+ export interface SkillIndexEntry {
21
+ readonly name: string;
22
+ readonly description: string;
23
+ readonly mainFile: string;
24
+ }
25
+ export interface BuildContextInput {
26
+ readonly identity: ContextBlockInput;
27
+ readonly userMessage: string;
28
+ readonly core?: ContextBlockInput;
29
+ readonly memory?: ContextBlockInput | readonly ContextBlockInput[];
30
+ readonly history?: readonly HistoryMessage[];
31
+ readonly skills?: readonly SkillIndexEntry[];
32
+ readonly skillInstructions?: ContextBlockInput | readonly ContextBlockInput[];
33
+ }
34
+ export type ContextSectionId = 'core' | 'identity' | 'memory' | 'history' | 'skills' | 'skill-instructions' | 'user-message';
35
+ export interface ContextSection {
36
+ readonly id: ContextSectionId;
37
+ readonly title: string;
38
+ readonly content: string;
39
+ readonly source?: string;
40
+ }
41
+ export interface BuiltAgentContext {
42
+ readonly prompt: string;
43
+ readonly sections: readonly ContextSection[];
44
+ readonly metadata: {
45
+ readonly usedDefaultCore: boolean;
46
+ readonly skillCount: number;
47
+ readonly historyCount: number;
48
+ readonly sources: readonly string[];
49
+ };
50
+ }
51
+ export interface FileContextInput {
52
+ readonly identityPath: string;
53
+ readonly userMessage: string;
54
+ readonly soulPath?: string;
55
+ readonly memory?: ContextBlockInput | readonly ContextBlockInput[];
56
+ readonly history?: readonly HistoryMessage[];
57
+ readonly skills?: readonly SkillIndexEntry[];
58
+ readonly skillsRoot?: string;
59
+ readonly skillInstructions?: ContextBlockInput | readonly ContextBlockInput[];
60
+ }
61
+ //# 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 ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@mono-agent/context",
3
+ "version": "0.1.0",
4
+ "description": "Deterministic context assembly for host-compatible agents.",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.build.json",
21
+ "typecheck": "tsc -p tsconfig.json --noEmit",
22
+ "test": "vitest run"
23
+ }
24
+ }