@dot-ai/core 0.5.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.
Files changed (96) hide show
  1. package/.ai/memory/2026-03-04.md +2 -0
  2. package/.ai/tasks.json +7 -0
  3. package/LICENSE +21 -0
  4. package/dist/__tests__/config.test.d.ts +2 -0
  5. package/dist/__tests__/config.test.d.ts.map +1 -0
  6. package/dist/__tests__/config.test.js +128 -0
  7. package/dist/__tests__/config.test.js.map +1 -0
  8. package/dist/__tests__/e2e.test.d.ts +2 -0
  9. package/dist/__tests__/e2e.test.d.ts.map +1 -0
  10. package/dist/__tests__/e2e.test.js +211 -0
  11. package/dist/__tests__/e2e.test.js.map +1 -0
  12. package/dist/__tests__/engine.test.d.ts +2 -0
  13. package/dist/__tests__/engine.test.d.ts.map +1 -0
  14. package/dist/__tests__/engine.test.js +271 -0
  15. package/dist/__tests__/engine.test.js.map +1 -0
  16. package/dist/__tests__/format.test.d.ts +2 -0
  17. package/dist/__tests__/format.test.d.ts.map +1 -0
  18. package/dist/__tests__/format.test.js +200 -0
  19. package/dist/__tests__/format.test.js.map +1 -0
  20. package/dist/__tests__/labels.test.d.ts +2 -0
  21. package/dist/__tests__/labels.test.d.ts.map +1 -0
  22. package/dist/__tests__/labels.test.js +82 -0
  23. package/dist/__tests__/labels.test.js.map +1 -0
  24. package/dist/__tests__/loader.test.d.ts +2 -0
  25. package/dist/__tests__/loader.test.d.ts.map +1 -0
  26. package/dist/__tests__/loader.test.js +161 -0
  27. package/dist/__tests__/loader.test.js.map +1 -0
  28. package/dist/__tests__/logger.test.d.ts +2 -0
  29. package/dist/__tests__/logger.test.d.ts.map +1 -0
  30. package/dist/__tests__/logger.test.js +95 -0
  31. package/dist/__tests__/logger.test.js.map +1 -0
  32. package/dist/__tests__/nodes.test.d.ts +2 -0
  33. package/dist/__tests__/nodes.test.d.ts.map +1 -0
  34. package/dist/__tests__/nodes.test.js +83 -0
  35. package/dist/__tests__/nodes.test.js.map +1 -0
  36. package/dist/config.d.ts +29 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +141 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/contracts.d.ts +56 -0
  41. package/dist/contracts.d.ts.map +1 -0
  42. package/dist/contracts.js +2 -0
  43. package/dist/contracts.js.map +1 -0
  44. package/dist/engine.d.ts +38 -0
  45. package/dist/engine.d.ts.map +1 -0
  46. package/dist/engine.js +88 -0
  47. package/dist/engine.js.map +1 -0
  48. package/dist/format.d.ts +18 -0
  49. package/dist/format.d.ts.map +1 -0
  50. package/dist/format.js +89 -0
  51. package/dist/format.js.map +1 -0
  52. package/dist/index.d.ts +21 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +22 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/labels.d.ts +13 -0
  57. package/dist/labels.d.ts.map +1 -0
  58. package/dist/labels.js +36 -0
  59. package/dist/labels.js.map +1 -0
  60. package/dist/loader.d.ts +26 -0
  61. package/dist/loader.d.ts.map +1 -0
  62. package/dist/loader.js +120 -0
  63. package/dist/loader.js.map +1 -0
  64. package/dist/logger.d.ts +29 -0
  65. package/dist/logger.d.ts.map +1 -0
  66. package/dist/logger.js +29 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/nodes.d.ts +15 -0
  69. package/dist/nodes.d.ts.map +1 -0
  70. package/dist/nodes.js +46 -0
  71. package/dist/nodes.js.map +1 -0
  72. package/dist/types.d.ts +111 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +23 -0
  77. package/src/__tests__/config.test.ts +166 -0
  78. package/src/__tests__/e2e.test.ts +257 -0
  79. package/src/__tests__/engine.test.ts +305 -0
  80. package/src/__tests__/format.test.ts +247 -0
  81. package/src/__tests__/labels.test.ts +96 -0
  82. package/src/__tests__/loader.test.ts +191 -0
  83. package/src/__tests__/logger.test.ts +113 -0
  84. package/src/__tests__/nodes.test.ts +103 -0
  85. package/src/config.ts +178 -0
  86. package/src/contracts.ts +71 -0
  87. package/src/engine.ts +145 -0
  88. package/src/format.ts +113 -0
  89. package/src/index.ts +63 -0
  90. package/src/labels.ts +40 -0
  91. package/src/loader.ts +152 -0
  92. package/src/logger.ts +49 -0
  93. package/src/nodes.ts +46 -0
  94. package/src/types.ts +123 -0
  95. package/tsconfig.json +23 -0
  96. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import type { MemoryProvider, SkillProvider, IdentityProvider, RoutingProvider, TaskProvider, ToolProvider } from './contracts.js';
2
+ import type { EnrichedContext, Identity, Skill } from './types.js';
3
+ import type { Logger } from './logger.js';
4
+ /**
5
+ * All providers needed by the engine.
6
+ */
7
+ export interface Providers {
8
+ memory: MemoryProvider;
9
+ skills: SkillProvider;
10
+ identity: IdentityProvider;
11
+ routing: RoutingProvider;
12
+ tasks: TaskProvider;
13
+ tools: ToolProvider;
14
+ }
15
+ /**
16
+ * Cached data from boot phase. Reused across prompts.
17
+ */
18
+ export interface BootCache {
19
+ identities: Identity[];
20
+ vocabulary: string[];
21
+ skills: Skill[];
22
+ }
23
+ /**
24
+ * Boot phase — run once per session.
25
+ * Loads identities, indexes skills/tools, builds label vocabulary.
26
+ */
27
+ export declare function boot(providers: Providers, logger?: Logger): Promise<BootCache>;
28
+ /**
29
+ * Enrich a prompt — run per prompt.
30
+ * Calls all providers to build an EnrichedContext.
31
+ */
32
+ export declare function enrich(prompt: string, providers: Providers, cache: BootCache, logger?: Logger): Promise<EnrichedContext>;
33
+ /**
34
+ * Learn phase — run after agent response.
35
+ * Stores learnings in memory.
36
+ */
37
+ export declare function learn(response: string, providers: Providers): Promise<void>;
38
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA8BpF;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CAWf"}
package/dist/engine.js ADDED
@@ -0,0 +1,88 @@
1
+ import { extractLabels, buildVocabulary } from './labels.js';
2
+ /**
3
+ * Boot phase — run once per session.
4
+ * Loads identities, indexes skills/tools, builds label vocabulary.
5
+ */
6
+ export async function boot(providers, logger) {
7
+ const start = performance.now();
8
+ const [identities, skills, tools] = await Promise.all([
9
+ providers.identity.load(),
10
+ providers.skills.list(),
11
+ providers.tools.list(),
12
+ ]);
13
+ // Build vocabulary from skill labels, skill triggers (excluding meta-triggers), and tool labels
14
+ const META_TRIGGERS = new Set(['always', 'auto', 'manual', 'boot', 'heartbeat', 'pipeline', 'audit']);
15
+ const skillTriggers = skills.map((s) => (s.triggers ?? []).filter((t) => !META_TRIGGERS.has(t)));
16
+ const vocabulary = buildVocabulary([...skills.map((s) => s.labels), ...skillTriggers], tools.map((t) => t.labels));
17
+ logger?.log({
18
+ timestamp: new Date().toISOString(),
19
+ level: 'info',
20
+ phase: 'boot',
21
+ event: 'boot_complete',
22
+ data: { identityCount: identities.length, skillCount: skills.length, vocabularySize: vocabulary.length },
23
+ durationMs: Math.round(performance.now() - start),
24
+ });
25
+ return { identities, vocabulary, skills };
26
+ }
27
+ /**
28
+ * Enrich a prompt — run per prompt.
29
+ * Calls all providers to build an EnrichedContext.
30
+ */
31
+ export async function enrich(prompt, providers, cache, logger) {
32
+ const start = performance.now();
33
+ // 1. Extract labels from prompt against known vocabulary
34
+ const labels = extractLabels(prompt, cache.vocabulary);
35
+ logger?.log({
36
+ timestamp: new Date().toISOString(),
37
+ level: 'info',
38
+ phase: 'enrich',
39
+ event: 'labels_extracted',
40
+ data: { labels: labels.map(l => l.name), vocabularySize: cache.vocabulary.length },
41
+ durationMs: Math.round(performance.now() - start),
42
+ });
43
+ // 2. Search memory + match skills + match tools + route — all in parallel
44
+ const [memories, matchedSkills, matchedTools, routing] = await Promise.all([
45
+ providers.memory.search(prompt, labels.map((l) => l.name)),
46
+ providers.skills.match(labels),
47
+ providers.tools.match(labels),
48
+ providers.routing.route(labels),
49
+ ]);
50
+ logger?.log({
51
+ timestamp: new Date().toISOString(),
52
+ level: 'info',
53
+ phase: 'enrich',
54
+ event: 'enrich_complete',
55
+ data: {
56
+ labelCount: labels.length,
57
+ memoryCount: memories.length,
58
+ skillCount: matchedSkills.length,
59
+ routing: routing.model,
60
+ },
61
+ durationMs: Math.round(performance.now() - start),
62
+ });
63
+ return {
64
+ prompt,
65
+ labels,
66
+ identities: cache.identities,
67
+ memories,
68
+ skills: matchedSkills,
69
+ tools: matchedTools,
70
+ routing,
71
+ };
72
+ }
73
+ /**
74
+ * Learn phase — run after agent response.
75
+ * Stores learnings in memory.
76
+ */
77
+ export async function learn(response, providers) {
78
+ const MAX_LEARN_LENGTH = 500;
79
+ const truncated = response.length > MAX_LEARN_LENGTH
80
+ ? response.slice(0, MAX_LEARN_LENGTH) + '…'
81
+ : response;
82
+ await providers.memory.store({
83
+ content: truncated,
84
+ type: 'log',
85
+ date: new Date().toISOString().slice(0, 10),
86
+ });
87
+ }
88
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { EnrichedContext } from './types.js';
2
+ import type { Logger } from './logger.js';
3
+ export interface FormatOptions {
4
+ /** Skip identity sections (useful when already injected at session start) */
5
+ skipIdentities?: boolean;
6
+ /** Max chars per skill content. Truncated skills get a [...truncated] marker. Default: unlimited */
7
+ maxSkillLength?: number;
8
+ /** Max number of skills to include (already sorted by match relevance). Default: unlimited */
9
+ maxSkills?: number;
10
+ /** Optional logger for tracing */
11
+ logger?: Logger;
12
+ }
13
+ /**
14
+ * Format an EnrichedContext into markdown sections for injection into agent context.
15
+ * Sections are ordered by priority: identity > memory > skills > tools > routing.
16
+ */
17
+ export declare function formatContext(ctx: EnrichedContext, options?: FormatOptions): string;
18
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA2C,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAyDnF"}
package/dist/format.js ADDED
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Format an EnrichedContext into markdown sections for injection into agent context.
3
+ * Sections are ordered by priority: identity > memory > skills > tools > routing.
4
+ */
5
+ export function formatContext(ctx, options) {
6
+ const start = performance.now();
7
+ const sections = [];
8
+ // Identity sections (sorted by priority, highest first)
9
+ if (!options?.skipIdentities) {
10
+ const sortedIdentities = [...ctx.identities].sort((a, b) => b.priority - a.priority);
11
+ for (const identity of sortedIdentities) {
12
+ if (identity.content) {
13
+ sections.push(identity.content);
14
+ }
15
+ }
16
+ }
17
+ // Memory section
18
+ if (ctx.memories.length > 0) {
19
+ sections.push(formatMemory(ctx.memories));
20
+ }
21
+ // Skills section
22
+ let loadedSkills = ctx.skills.filter(s => s.content);
23
+ if (options?.maxSkills != null) {
24
+ loadedSkills = loadedSkills.slice(0, options.maxSkills);
25
+ }
26
+ if (loadedSkills.length > 0) {
27
+ sections.push(formatSkills(loadedSkills, options?.maxSkillLength));
28
+ }
29
+ // Tools section
30
+ if (ctx.tools.length > 0) {
31
+ sections.push(formatTools(ctx.tools));
32
+ }
33
+ // Routing hint
34
+ if (ctx.routing.model !== 'default') {
35
+ sections.push(formatRouting(ctx.routing));
36
+ }
37
+ const result = sections.join('\n\n---\n\n');
38
+ options?.logger?.log({
39
+ timestamp: new Date().toISOString(),
40
+ level: 'info',
41
+ phase: 'format',
42
+ event: 'format_complete',
43
+ data: {
44
+ outputChars: result.length,
45
+ estimatedTokens: Math.round(result.length / 4),
46
+ skillsIncluded: loadedSkills.map(s => s.name),
47
+ truncatedSkills: loadedSkills
48
+ .filter(s => options?.maxSkillLength != null && (s.content?.length ?? 0) > options.maxSkillLength)
49
+ .map(s => s.name),
50
+ },
51
+ durationMs: Math.round(performance.now() - start),
52
+ });
53
+ return result;
54
+ }
55
+ function formatMemory(memories) {
56
+ const lines = ['## Relevant Memory\n'];
57
+ for (const m of memories.slice(0, 10)) { // Limit to 10 most relevant
58
+ const date = m.date ? ` (${m.date})` : '';
59
+ lines.push(`- ${m.content}${date}`);
60
+ }
61
+ return lines.join('\n');
62
+ }
63
+ function formatSkills(skills, maxLength) {
64
+ const lines = ['## Active Skills\n'];
65
+ for (const s of skills) {
66
+ lines.push(`### ${s.name}`);
67
+ if (s.content) {
68
+ if (maxLength != null && s.content.length > maxLength) {
69
+ lines.push(s.content.slice(0, maxLength) + '\n\n[...truncated]');
70
+ }
71
+ else {
72
+ lines.push(s.content);
73
+ }
74
+ }
75
+ lines.push('');
76
+ }
77
+ return lines.join('\n');
78
+ }
79
+ function formatTools(tools) {
80
+ const lines = ['## Available Tools\n'];
81
+ for (const t of tools) {
82
+ lines.push(`- **${t.name}**: ${t.description}`);
83
+ }
84
+ return lines.join('\n');
85
+ }
86
+ function formatRouting(routing) {
87
+ return `## Model Routing\n\nRecommended model: **${routing.model}** (${routing.reason})`;
88
+ }
89
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @dot-ai/core v4 — Contracts and types for the dot-ai convention.
3
+ *
4
+ * dot-ai = contracts (interfaces) + providers (pluggable implementations) + adapters (agent integration).
5
+ * Core defines WHAT, providers define HOW, adapters define WHERE.
6
+ */
7
+ export type { Label, Node, MemoryEntry, Skill, Identity, Task, Tool, RoutingResult, EnrichedContext, TaskFilter, DotAiConfig, DebugConfig, ProviderConfig, WorkspaceConfig, } from './types.js';
8
+ export type { MemoryProvider, SkillProvider, IdentityProvider, RoutingProvider, TaskProvider, ToolProvider, ProviderFactory, } from './contracts.js';
9
+ export { boot, enrich, learn } from './engine.js';
10
+ export type { Providers, BootCache } from './engine.js';
11
+ export { loadConfig, resolveConfig, injectRoot } from './config.js';
12
+ export type { ResolvedConfig } from './config.js';
13
+ export { formatContext } from './format.js';
14
+ export type { FormatOptions } from './format.js';
15
+ export type { LogLevel, LogEntry, Logger } from './logger.js';
16
+ export { NoopLogger, JsonFileLogger, StderrLogger } from './logger.js';
17
+ export { registerProvider, clearProviders, createProviders } from './loader.js';
18
+ export { extractLabels, buildVocabulary } from './labels.js';
19
+ export { discoverNodes, parseScanDirs } from './nodes.js';
20
+ export { registerDefaults } from './loader.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,KAAK,EACL,IAAI,EACJ,WAAW,EACX,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,eAAe,EACf,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGvE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGhF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @dot-ai/core v4 — Contracts and types for the dot-ai convention.
3
+ *
4
+ * dot-ai = contracts (interfaces) + providers (pluggable implementations) + adapters (agent integration).
5
+ * Core defines WHAT, providers define HOW, adapters define WHERE.
6
+ */
7
+ // ── Engine ──
8
+ export { boot, enrich, learn } from './engine.js';
9
+ // ── Config ──
10
+ export { loadConfig, resolveConfig, injectRoot } from './config.js';
11
+ // ── Format ──
12
+ export { formatContext } from './format.js';
13
+ export { NoopLogger, JsonFileLogger, StderrLogger } from './logger.js';
14
+ // ── Loader ──
15
+ export { registerProvider, clearProviders, createProviders } from './loader.js';
16
+ // ── Labels ──
17
+ export { extractLabels, buildVocabulary } from './labels.js';
18
+ // ── Nodes ──
19
+ export { discoverNodes, parseScanDirs } from './nodes.js';
20
+ // ── registerDefaults ──
21
+ export { registerDefaults } from './loader.js';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,eAAe;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGlD,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGpE,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhF,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D,yBAAyB;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Label } from './types.js';
2
+ /**
3
+ * Extract labels from a prompt using word-boundary keyword matching.
4
+ * No LLM — pure deterministic pattern matching.
5
+ * Returns matched Label[] from a known vocabulary.
6
+ */
7
+ export declare function extractLabels(prompt: string, vocabulary: string[]): Label[];
8
+ /**
9
+ * Build a vocabulary from skill labels and any other known labels.
10
+ * This is called once at boot to build the label dictionary.
11
+ */
12
+ export declare function buildVocabulary(skillLabels: string[][], toolLabels: string[][]): string[];
13
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAc3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAQzF"}
package/dist/labels.js ADDED
@@ -0,0 +1,36 @@
1
+ function escapeRegex(s) {
2
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3
+ }
4
+ /**
5
+ * Extract labels from a prompt using word-boundary keyword matching.
6
+ * No LLM — pure deterministic pattern matching.
7
+ * Returns matched Label[] from a known vocabulary.
8
+ */
9
+ export function extractLabels(prompt, vocabulary) {
10
+ const labels = [];
11
+ const seen = new Set();
12
+ for (const word of vocabulary) {
13
+ if (seen.has(word))
14
+ continue;
15
+ const regex = new RegExp(`\\b${escapeRegex(word)}\\b`, 'i');
16
+ if (regex.test(prompt)) {
17
+ seen.add(word);
18
+ labels.push({ name: word, source: 'extract' });
19
+ }
20
+ }
21
+ return labels;
22
+ }
23
+ /**
24
+ * Build a vocabulary from skill labels and any other known labels.
25
+ * This is called once at boot to build the label dictionary.
26
+ */
27
+ export function buildVocabulary(skillLabels, toolLabels) {
28
+ const set = new Set();
29
+ for (const labels of [...skillLabels, ...toolLabels]) {
30
+ for (const label of labels) {
31
+ set.add(label);
32
+ }
33
+ }
34
+ return Array.from(set);
35
+ }
36
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,UAAoB;IAChE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAuB,EAAE,UAAsB;IAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { DotAiConfig } from './types.js';
2
+ import type { Providers } from './engine.js';
3
+ /**
4
+ * Register a provider factory.
5
+ * Call this before createProviders().
6
+ *
7
+ * @example
8
+ * registerProvider('@dot-ai/cockpit-memory', (opts) => new CockpitMemory(opts.url));
9
+ */
10
+ export declare function registerProvider(name: string, factory: (options: Record<string, unknown>) => unknown): void;
11
+ /**
12
+ * Clear all registered providers.
13
+ * Useful for testing.
14
+ */
15
+ export declare function clearProviders(): void;
16
+ /**
17
+ * Register all default file-based providers.
18
+ * Call this at startup if you want file-based defaults available.
19
+ */
20
+ export declare function registerDefaults(): void;
21
+ /**
22
+ * Create all providers from config.
23
+ * Falls back to no-op providers for any missing registration.
24
+ */
25
+ export declare function createProviders(config: DotAiConfig): Promise<Providers>;
26
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,YAAY,CAAC;AASpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GACrD,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAW7E"}
package/dist/loader.js ADDED
@@ -0,0 +1,120 @@
1
+ import { resolveConfig } from './config.js';
2
+ /**
3
+ * Registry of provider factories.
4
+ * Adapters register their providers here before boot.
5
+ */
6
+ const registry = new Map();
7
+ /**
8
+ * Register a provider factory.
9
+ * Call this before createProviders().
10
+ *
11
+ * @example
12
+ * registerProvider('@dot-ai/cockpit-memory', (opts) => new CockpitMemory(opts.url));
13
+ */
14
+ export function registerProvider(name, factory) {
15
+ registry.set(name, factory);
16
+ }
17
+ /**
18
+ * Clear all registered providers.
19
+ * Useful for testing.
20
+ */
21
+ export function clearProviders() {
22
+ registry.clear();
23
+ }
24
+ /**
25
+ * Register all default file-based providers.
26
+ * Call this at startup if you want file-based defaults available.
27
+ */
28
+ export function registerDefaults() {
29
+ // Default providers are now separate packages (@dot-ai/provider-file-memory, etc.)
30
+ // They are resolved via auto-discovery in resolve() → tryImportProvider()
31
+ // No explicit registration needed — the package names match the config defaults.
32
+ }
33
+ /**
34
+ * Create all providers from config.
35
+ * Falls back to no-op providers for any missing registration.
36
+ */
37
+ export async function createProviders(config) {
38
+ const resolved = resolveConfig(config);
39
+ return {
40
+ memory: await resolve(resolved.memory.use, resolved.memory.with ?? {}, noopMemory),
41
+ skills: await resolve(resolved.skills.use, resolved.skills.with ?? {}, noopSkills),
42
+ identity: await resolve(resolved.identity.use, resolved.identity.with ?? {}, noopIdentity),
43
+ routing: await resolve(resolved.routing.use, resolved.routing.with ?? {}, noopRouting),
44
+ tasks: await resolve(resolved.tasks.use, resolved.tasks.with ?? {}, noopTasks),
45
+ tools: await resolve(resolved.tools.use, resolved.tools.with ?? {}, noopTools),
46
+ };
47
+ }
48
+ async function resolve(name, options, fallback) {
49
+ let factory = registry.get(name);
50
+ if (!factory) {
51
+ // Auto-discovery: try dynamic import
52
+ factory = await tryImportProvider(name);
53
+ if (factory) {
54
+ registry.set(name, factory); // Cache for next time
55
+ }
56
+ }
57
+ if (!factory)
58
+ return fallback;
59
+ return factory(options);
60
+ }
61
+ /**
62
+ * Try to import a provider package dynamically.
63
+ * Looks for: default export factory, createXxxProvider function, or XxxProvider class.
64
+ */
65
+ async function tryImportProvider(name) {
66
+ try {
67
+ const mod = await import(name);
68
+ // 1. Check for default export (function)
69
+ if (typeof mod.default === 'function') {
70
+ return mod.default;
71
+ }
72
+ // 2. Check for createXxxProvider factory function
73
+ for (const [key, value] of Object.entries(mod)) {
74
+ if (key.startsWith('create') && key.endsWith('Provider') && typeof value === 'function') {
75
+ return value;
76
+ }
77
+ }
78
+ // 3. Check for XxxProvider class (constructor)
79
+ for (const [key, value] of Object.entries(mod)) {
80
+ if (key.endsWith('Provider') && typeof value === 'function') {
81
+ return (opts) => new value(opts);
82
+ }
83
+ }
84
+ return undefined;
85
+ }
86
+ catch {
87
+ // Package not found or import error — not a problem, fall back to noop
88
+ return undefined;
89
+ }
90
+ }
91
+ // ── No-op providers (safe fallbacks) ────────────────────────────────────────
92
+ const noopMemory = {
93
+ async search(_query, _labels) { return []; },
94
+ async store(_entry) { },
95
+ };
96
+ const noopSkills = {
97
+ async list() { return []; },
98
+ async match(_labels) { return []; },
99
+ async load(_name) { return null; },
100
+ };
101
+ const noopIdentity = {
102
+ async load() { return []; },
103
+ };
104
+ const noopRouting = {
105
+ async route(_labels) { return { model: 'default', reason: 'no routing provider' }; },
106
+ };
107
+ const noopTasks = {
108
+ async list(_filter) { return []; },
109
+ async get(_id) { return null; },
110
+ async create(task) { return { id: crypto.randomUUID(), ...task }; },
111
+ async update(id, patch) {
112
+ return { id, text: '', status: '', ...patch };
113
+ },
114
+ };
115
+ const noopTools = {
116
+ async list() { return []; },
117
+ async match(_labels) { return []; },
118
+ async load(_name) { return null; },
119
+ };
120
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export interface LogEntry {
3
+ timestamp: string;
4
+ level: LogLevel;
5
+ phase: 'boot' | 'enrich' | 'learn' | 'format';
6
+ event: string;
7
+ data?: Record<string, unknown>;
8
+ durationMs?: number;
9
+ }
10
+ export interface Logger {
11
+ log(entry: LogEntry): void;
12
+ flush(): Promise<void>;
13
+ }
14
+ export declare class NoopLogger implements Logger {
15
+ log(_entry: LogEntry): void;
16
+ flush(): Promise<void>;
17
+ }
18
+ export declare class JsonFileLogger implements Logger {
19
+ private buffer;
20
+ private filePath;
21
+ constructor(filePath: string);
22
+ log(entry: LogEntry): void;
23
+ flush(): Promise<void>;
24
+ }
25
+ export declare class StderrLogger implements Logger {
26
+ log(entry: LogEntry): void;
27
+ flush(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,UAAW,YAAW,MAAM;IACvC,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B;AAED,qBAAa,cAAe,YAAW,MAAM;IAC3C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAIpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B;AAED,qBAAa,YAAa,YAAW,MAAM;IACzC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAGpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B"}
package/dist/logger.js ADDED
@@ -0,0 +1,29 @@
1
+ import { appendFile } from 'node:fs/promises';
2
+ export class NoopLogger {
3
+ log(_entry) { }
4
+ async flush() { }
5
+ }
6
+ export class JsonFileLogger {
7
+ buffer = [];
8
+ filePath;
9
+ constructor(filePath) {
10
+ this.filePath = filePath;
11
+ }
12
+ log(entry) {
13
+ this.buffer.push(JSON.stringify(entry));
14
+ }
15
+ async flush() {
16
+ if (this.buffer.length === 0)
17
+ return;
18
+ const data = this.buffer.join('\n') + '\n';
19
+ this.buffer = [];
20
+ await appendFile(this.filePath, data, 'utf-8');
21
+ }
22
+ }
23
+ export class StderrLogger {
24
+ log(entry) {
25
+ process.stderr.write(JSON.stringify(entry) + '\n');
26
+ }
27
+ async flush() { }
28
+ }
29
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAkB9C,MAAM,OAAO,UAAU;IACrB,GAAG,CAAC,MAAgB,IAAS,CAAC;IAC9B,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC;AAED,MAAM,OAAO,cAAc;IACjB,MAAM,GAAa,EAAE,CAAC;IACtB,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,KAAe;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACvB,GAAG,CAAC,KAAe;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC"}
@@ -0,0 +1,15 @@
1
+ import type { Node } from './types.js';
2
+ /**
3
+ * Discover all .ai/ directories in a workspace.
4
+ * Always includes root. Scans configurable directories for sub-nodes.
5
+ *
6
+ * @param root - workspace root (absolute path)
7
+ * @param scanDirs - directories to scan for sub-nodes (default: ["projects"])
8
+ */
9
+ export declare function discoverNodes(root: string, scanDirs?: string[]): Node[];
10
+ /**
11
+ * Parse scanDirs from a config string value.
12
+ * Returns empty array if not configured.
13
+ */
14
+ export declare function parseScanDirs(value: unknown): string[];
15
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAiB,GAAG,IAAI,EAAE,CAyBrF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAGtD"}