@dot-ai/core 0.5.2 → 0.8.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.
Files changed (132) hide show
  1. package/dist/boot-cache.d.ts +40 -0
  2. package/dist/boot-cache.d.ts.map +1 -0
  3. package/dist/boot-cache.js +72 -0
  4. package/dist/boot-cache.js.map +1 -0
  5. package/dist/capabilities.d.ts +35 -0
  6. package/dist/capabilities.d.ts.map +1 -0
  7. package/dist/capabilities.js +17 -0
  8. package/dist/capabilities.js.map +1 -0
  9. package/dist/config.d.ts +7 -23
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +131 -108
  12. package/dist/config.js.map +1 -1
  13. package/dist/extension-api.d.ts +65 -0
  14. package/dist/extension-api.d.ts.map +1 -0
  15. package/dist/extension-api.js +2 -0
  16. package/dist/extension-api.js.map +1 -0
  17. package/dist/extension-loader.d.ts +19 -0
  18. package/dist/extension-loader.d.ts.map +1 -0
  19. package/dist/extension-loader.js +113 -0
  20. package/dist/extension-loader.js.map +1 -0
  21. package/dist/extension-runner.d.ts +62 -0
  22. package/dist/extension-runner.d.ts.map +1 -0
  23. package/dist/extension-runner.js +260 -0
  24. package/dist/extension-runner.js.map +1 -0
  25. package/dist/extension-types.d.ts +312 -0
  26. package/dist/extension-types.d.ts.map +1 -0
  27. package/dist/extension-types.js +89 -0
  28. package/dist/extension-types.js.map +1 -0
  29. package/dist/format.d.ts +13 -1
  30. package/dist/format.d.ts.map +1 -1
  31. package/dist/format.js +131 -15
  32. package/dist/format.js.map +1 -1
  33. package/dist/format.spec.d.ts +2 -0
  34. package/dist/format.spec.d.ts.map +1 -0
  35. package/dist/format.spec.js +140 -0
  36. package/dist/format.spec.js.map +1 -0
  37. package/dist/index.d.ts +21 -14
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +21 -14
  40. package/dist/index.js.map +1 -1
  41. package/dist/logger.d.ts +1 -1
  42. package/dist/logger.d.ts.map +1 -1
  43. package/dist/package-manager.d.ts +30 -0
  44. package/dist/package-manager.d.ts.map +1 -0
  45. package/dist/package-manager.js +91 -0
  46. package/dist/package-manager.js.map +1 -0
  47. package/dist/runtime.d.ts +119 -0
  48. package/dist/runtime.d.ts.map +1 -0
  49. package/dist/runtime.js +441 -0
  50. package/dist/runtime.js.map +1 -0
  51. package/dist/types.d.ts +29 -10
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +4 -1
  54. package/src/__tests__/capabilities.test.ts +72 -0
  55. package/src/__tests__/config.test.ts +22 -120
  56. package/src/__tests__/extension-loader.test.ts +84 -0
  57. package/src/__tests__/extension-runner.test.ts +228 -0
  58. package/src/__tests__/fixtures/extensions/ctx-aware.js +26 -0
  59. package/src/__tests__/fixtures/extensions/security-gate.js +20 -0
  60. package/src/__tests__/fixtures/extensions/session-analytics.js +28 -0
  61. package/src/__tests__/fixtures/extensions/smart-context.js +10 -0
  62. package/src/__tests__/format.test.ts +207 -2
  63. package/src/__tests__/runtime.test.ts +141 -0
  64. package/src/boot-cache.ts +104 -0
  65. package/src/capabilities.ts +49 -0
  66. package/src/config.ts +131 -133
  67. package/src/extension-api.ts +99 -0
  68. package/src/extension-loader.ts +127 -0
  69. package/src/extension-runner.ts +297 -0
  70. package/src/extension-types.ts +416 -0
  71. package/src/format.spec.ts +175 -0
  72. package/src/format.test.ts +218 -0
  73. package/src/format.ts +140 -16
  74. package/src/index.ts +68 -30
  75. package/src/logger.ts +1 -1
  76. package/src/package-manager.ts +119 -0
  77. package/src/runtime.ts +562 -0
  78. package/src/types.ts +36 -14
  79. package/tsconfig.json +1 -1
  80. package/tsconfig.tsbuildinfo +1 -1
  81. package/.ai/memory/2026-03-04.md +0 -2
  82. package/.ai/tasks.json +0 -7
  83. package/dist/__tests__/config.test.d.ts +0 -2
  84. package/dist/__tests__/config.test.d.ts.map +0 -1
  85. package/dist/__tests__/config.test.js +0 -128
  86. package/dist/__tests__/config.test.js.map +0 -1
  87. package/dist/__tests__/e2e.test.d.ts +0 -2
  88. package/dist/__tests__/e2e.test.d.ts.map +0 -1
  89. package/dist/__tests__/e2e.test.js +0 -211
  90. package/dist/__tests__/e2e.test.js.map +0 -1
  91. package/dist/__tests__/engine.test.d.ts +0 -2
  92. package/dist/__tests__/engine.test.d.ts.map +0 -1
  93. package/dist/__tests__/engine.test.js +0 -271
  94. package/dist/__tests__/engine.test.js.map +0 -1
  95. package/dist/__tests__/format.test.d.ts +0 -2
  96. package/dist/__tests__/format.test.d.ts.map +0 -1
  97. package/dist/__tests__/format.test.js +0 -200
  98. package/dist/__tests__/format.test.js.map +0 -1
  99. package/dist/__tests__/labels.test.d.ts +0 -2
  100. package/dist/__tests__/labels.test.d.ts.map +0 -1
  101. package/dist/__tests__/labels.test.js +0 -82
  102. package/dist/__tests__/labels.test.js.map +0 -1
  103. package/dist/__tests__/loader.test.d.ts +0 -2
  104. package/dist/__tests__/loader.test.d.ts.map +0 -1
  105. package/dist/__tests__/loader.test.js +0 -161
  106. package/dist/__tests__/loader.test.js.map +0 -1
  107. package/dist/__tests__/logger.test.d.ts +0 -2
  108. package/dist/__tests__/logger.test.d.ts.map +0 -1
  109. package/dist/__tests__/logger.test.js +0 -95
  110. package/dist/__tests__/logger.test.js.map +0 -1
  111. package/dist/__tests__/nodes.test.d.ts +0 -2
  112. package/dist/__tests__/nodes.test.d.ts.map +0 -1
  113. package/dist/__tests__/nodes.test.js +0 -83
  114. package/dist/__tests__/nodes.test.js.map +0 -1
  115. package/dist/contracts.d.ts +0 -56
  116. package/dist/contracts.d.ts.map +0 -1
  117. package/dist/contracts.js +0 -2
  118. package/dist/contracts.js.map +0 -1
  119. package/dist/engine.d.ts +0 -38
  120. package/dist/engine.d.ts.map +0 -1
  121. package/dist/engine.js +0 -88
  122. package/dist/engine.js.map +0 -1
  123. package/dist/loader.d.ts +0 -26
  124. package/dist/loader.d.ts.map +0 -1
  125. package/dist/loader.js +0 -120
  126. package/dist/loader.js.map +0 -1
  127. package/src/__tests__/e2e.test.ts +0 -257
  128. package/src/__tests__/engine.test.ts +0 -305
  129. package/src/__tests__/loader.test.ts +0 -191
  130. package/src/contracts.ts +0 -71
  131. package/src/engine.ts +0 -145
  132. package/src/loader.ts +0 -152
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Cached boot data — vocabulary, extension paths, tool schemas.
3
+ * Stored at .ai/.cache/boot.json for fast hook startup.
4
+ */
5
+ export interface BootCacheData {
6
+ /** Cache format version */
7
+ version: 1;
8
+ /** Checksum of inputs that produced this cache */
9
+ checksum: string;
10
+ /** Label vocabulary from resources_discover */
11
+ vocabulary: string[];
12
+ /** Extension paths that were loaded */
13
+ extensionPaths: string[];
14
+ /** Tool names + descriptions from registered tools */
15
+ tools: Array<{
16
+ name: string;
17
+ description: string;
18
+ }>;
19
+ /** Timestamp of cache creation */
20
+ createdAt: string;
21
+ }
22
+ /**
23
+ * Compute a checksum from file modification times.
24
+ * Used to invalidate the cache when extensions or config change.
25
+ */
26
+ export declare function computeChecksum(workspaceRoot: string, extensionPaths: string[]): Promise<string>;
27
+ /**
28
+ * Try to load cached boot data.
29
+ * Returns null if cache is missing, invalid, or checksum doesn't match.
30
+ */
31
+ export declare function loadBootCache(workspaceRoot: string, currentChecksum: string): Promise<BootCacheData | null>;
32
+ /**
33
+ * Write boot cache to disk.
34
+ */
35
+ export declare function writeBootCache(workspaceRoot: string, data: BootCacheData): Promise<void>;
36
+ /**
37
+ * Clear the boot cache.
38
+ */
39
+ export declare function clearBootCache(workspaceRoot: string): Promise<void>;
40
+ //# sourceMappingURL=boot-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-cache.d.ts","sourceRoot":"","sources":["../src/boot-cache.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,uCAAuC;IACvC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAa/B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE"}
@@ -0,0 +1,72 @@
1
+ import { readFile, writeFile, mkdir, stat } from 'node:fs/promises';
2
+ import { createHash } from 'node:crypto';
3
+ import { join } from 'node:path';
4
+ const CACHE_DIR = '.ai/.cache';
5
+ const CACHE_FILE = 'boot.json';
6
+ /**
7
+ * Compute a checksum from file modification times.
8
+ * Used to invalidate the cache when extensions or config change.
9
+ */
10
+ export async function computeChecksum(workspaceRoot, extensionPaths) {
11
+ const hash = createHash('sha256');
12
+ // Include settings.json mtime (or dot-ai.yml)
13
+ for (const configName of ['settings.json', 'dot-ai.yml']) {
14
+ try {
15
+ const s = await stat(join(workspaceRoot, '.ai', configName));
16
+ hash.update(`config:${configName}:${s.mtimeMs}`);
17
+ }
18
+ catch { /* not found */ }
19
+ }
20
+ // Include .ai/extensions/ dir mtime
21
+ try {
22
+ const s = await stat(join(workspaceRoot, '.ai', 'extensions'));
23
+ hash.update(`extdir:${s.mtimeMs}`);
24
+ }
25
+ catch { /* not found */ }
26
+ // Include each extension file's mtime
27
+ for (const extPath of extensionPaths.sort()) {
28
+ try {
29
+ const s = await stat(extPath);
30
+ hash.update(`ext:${extPath}:${s.mtimeMs}`);
31
+ }
32
+ catch { /* not found */ }
33
+ }
34
+ return hash.digest('hex').slice(0, 16);
35
+ }
36
+ /**
37
+ * Try to load cached boot data.
38
+ * Returns null if cache is missing, invalid, or checksum doesn't match.
39
+ */
40
+ export async function loadBootCache(workspaceRoot, currentChecksum) {
41
+ try {
42
+ const cachePath = join(workspaceRoot, CACHE_DIR, CACHE_FILE);
43
+ const raw = await readFile(cachePath, 'utf-8');
44
+ const data = JSON.parse(raw);
45
+ if (data.version !== 1)
46
+ return null;
47
+ if (data.checksum !== currentChecksum)
48
+ return null;
49
+ return data;
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ /**
56
+ * Write boot cache to disk.
57
+ */
58
+ export async function writeBootCache(workspaceRoot, data) {
59
+ const cacheDir = join(workspaceRoot, CACHE_DIR);
60
+ await mkdir(cacheDir, { recursive: true });
61
+ const cachePath = join(cacheDir, CACHE_FILE);
62
+ await writeFile(cachePath, JSON.stringify(data, null, 2), 'utf-8');
63
+ }
64
+ /**
65
+ * Clear the boot cache.
66
+ */
67
+ export async function clearBootCache(workspaceRoot) {
68
+ const { rm } = await import('node:fs/promises');
69
+ const cacheDir = join(workspaceRoot, CACHE_DIR);
70
+ await rm(cacheDir, { recursive: true, force: true });
71
+ }
72
+ //# sourceMappingURL=boot-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-cache.js","sourceRoot":"","sources":["../src/boot-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,cAAwB;IAExB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,8CAA8C;IAC9C,KAAK,MAAM,UAAU,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,UAAU,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;IAED,oCAAoC;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,sCAAsC;IACtC,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,eAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;QAE9C,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,KAAK,eAAe;YAAE,OAAO,IAAI,CAAC;QAEnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,IAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAqB;IACxD,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ToolDefinition } from './extension-types.js';
2
+ /**
3
+ * The result returned by a capability execution.
4
+ */
5
+ export interface CapabilityResult {
6
+ text: string;
7
+ details?: Record<string, unknown>;
8
+ }
9
+ /**
10
+ * An interactive tool (capability) that an extension exposes to agents.
11
+ * Adapters translate these into the agent's native tool format.
12
+ */
13
+ export interface Capability {
14
+ name: string;
15
+ description: string;
16
+ parameters: Record<string, unknown>;
17
+ execute(params: Record<string, unknown>): Promise<CapabilityResult>;
18
+ /** Capability category */
19
+ category?: 'memory' | 'tasks' | string;
20
+ /** Whether this capability only reads data (no side effects) */
21
+ readOnly?: boolean;
22
+ /** Whether the adapter should ask for user confirmation before executing */
23
+ confirmationRequired?: boolean;
24
+ /** Capability version — incremented when parameter schema changes */
25
+ version?: number;
26
+ /** Injected into system prompt when tool is active */
27
+ promptSnippet?: string;
28
+ /** Guidelines for the LLM when using this tool */
29
+ promptGuidelines?: string;
30
+ }
31
+ /**
32
+ * Convert an extension ToolDefinition into a Capability.
33
+ */
34
+ export declare function toolDefinitionToCapability(tool: ToolDefinition): Capability;
35
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpE,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAY3E"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Convert an extension ToolDefinition into a Capability.
3
+ */
4
+ export function toolDefinitionToCapability(tool) {
5
+ return {
6
+ name: tool.name,
7
+ description: tool.description,
8
+ parameters: tool.parameters,
9
+ promptSnippet: tool.promptSnippet,
10
+ promptGuidelines: tool.promptGuidelines,
11
+ async execute(params) {
12
+ const result = await tool.execute(params);
13
+ return { text: result.content, details: result.details };
14
+ },
15
+ };
16
+ }
17
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAiCA;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAoB;IAC7D,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,KAAK,CAAC,OAAO,CAAC,MAA+B;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAA8C,EAAE,CAAC;QAClG,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,29 +1,13 @@
1
- import type { DotAiConfig, ProviderConfig } from './types.js';
1
+ import type { DotAiConfig } from './types.js';
2
2
  /**
3
- * Inject the workspace root into all provider sections of a DotAiConfig.
4
- * This ensures file-based providers resolve paths relative to the workspace.
5
- */
6
- export declare function injectRoot(config: DotAiConfig, root: string): DotAiConfig;
7
- /**
8
- * Load and parse dot-ai.yml from a workspace root.
9
- * Returns the config with defaults applied.
10
- *
11
- * Uses a minimal YAML parser (key: value pairs + nested objects).
12
- * No dependency on yaml package.
3
+ * Load config from workspace root.
4
+ * Tries settings.json first, falls back to empty config.
13
5
  */
14
6
  export declare function loadConfig(workspaceRoot: string): Promise<DotAiConfig>;
15
7
  /**
16
- * Resolve a config with defaults.
17
- * Any missing provider gets the built-in file-based default.
8
+ * Migrate dot-ai.yml to settings.json.
9
+ * Reads the existing YAML config and writes a settings.json equivalent.
10
+ * Returns the path of the written file, or null if no YAML config exists.
18
11
  */
19
- export interface ResolvedConfig {
20
- memory: ProviderConfig;
21
- skills: ProviderConfig;
22
- identity: ProviderConfig;
23
- routing: ProviderConfig;
24
- tasks: ProviderConfig;
25
- tools: ProviderConfig;
26
- debug?: import('./types.js').DebugConfig;
27
- }
28
- export declare function resolveConfig(config: DotAiConfig): ResolvedConfig;
12
+ export declare function migrateConfig(workspaceRoot: string): Promise<string | null>;
29
13
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG9D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAwBzE;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAY5E;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,YAAY,EAAE,WAAW,CAAC;CAC1C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAUjE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AA6DhE;;;GAGG;AACH,wBAAsB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAI5E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBjF"}
package/dist/config.js CHANGED
@@ -1,141 +1,164 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
- import { discoverNodes, parseScanDirs } from './nodes.js';
4
3
  /**
5
- * Inject the workspace root into all provider sections of a DotAiConfig.
6
- * This ensures file-based providers resolve paths relative to the workspace.
4
+ * Load settings.json (Pi-compatible format).
5
+ *
6
+ * Format:
7
+ * {
8
+ * "packages": ["npm:@dot-ai/ext-cockpit@1.0.0"],
9
+ * "extensions": [".ai/extensions/custom.ts"],
10
+ * "debug": { "logPath": "..." },
11
+ * "workspace": { "scanDirs": "..." }
12
+ * }
13
+ */
14
+ async function loadSettingsJson(workspaceRoot) {
15
+ const settingsPath = join(workspaceRoot, '.ai', 'settings.json');
16
+ try {
17
+ const raw = await readFile(settingsPath, 'utf-8');
18
+ const json = JSON.parse(raw);
19
+ return settingsJsonToConfig(json);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * Convert Pi-compatible settings.json to DotAiConfig.
7
27
  */
8
- export function injectRoot(config, root) {
9
- // Discover workspace nodes
10
- const globalScanDirs = parseScanDirs(config.workspace?.scanDirs ?? 'projects');
11
- const nodes = discoverNodes(root, globalScanDirs);
12
- const result = {};
13
- const providerKeys = ['memory', 'skills', 'identity', 'routing', 'tasks', 'tools'];
14
- for (const key of providerKeys) {
15
- const section = config[key];
16
- if (section && typeof section === 'object') {
17
- result[key] = {
18
- ...section,
19
- with: { root, nodes, ...(section.with ?? {}) },
20
- };
28
+ function settingsJsonToConfig(json) {
29
+ const config = {};
30
+ // Extensions: string[] of local paths
31
+ const extensions = json['extensions'];
32
+ const packages = json['packages'];
33
+ if ((extensions && Array.isArray(extensions)) || (packages && Array.isArray(packages))) {
34
+ config.extensions = {};
35
+ if (extensions && Array.isArray(extensions)) {
36
+ config.extensions.paths = extensions.filter((e) => typeof e === 'string');
37
+ }
38
+ if (packages && Array.isArray(packages)) {
39
+ config.extensions.packages = packages.filter((p) => typeof p === 'string');
21
40
  }
22
41
  }
23
- // Preserve non-provider sections
24
- if (config.debug) {
25
- result.debug = config.debug;
42
+ // Debug section
43
+ if (json['debug'] && typeof json['debug'] === 'object') {
44
+ const debug = json['debug'];
45
+ config.debug = {};
46
+ if (typeof debug['logPath'] === 'string')
47
+ config.debug.logPath = debug['logPath'];
26
48
  }
27
- if (config.workspace) {
28
- result.workspace = config.workspace;
49
+ // Workspace section
50
+ if (json['workspace'] && typeof json['workspace'] === 'object') {
51
+ const ws = json['workspace'];
52
+ config.workspace = {};
53
+ if (typeof ws['scanDirs'] === 'string')
54
+ config.workspace.scanDirs = ws['scanDirs'];
29
55
  }
30
- return result;
56
+ return config;
31
57
  }
32
58
  /**
33
- * Load and parse dot-ai.yml from a workspace root.
34
- * Returns the config with defaults applied.
35
- *
36
- * Uses a minimal YAML parser (key: value pairs + nested objects).
37
- * No dependency on yaml package.
59
+ * Load config from workspace root.
60
+ * Tries settings.json first, falls back to empty config.
38
61
  */
39
62
  export async function loadConfig(workspaceRoot) {
40
- const configPath = join(workspaceRoot, '.ai', 'dot-ai.yml');
63
+ const settingsConfig = await loadSettingsJson(workspaceRoot);
64
+ if (settingsConfig)
65
+ return settingsConfig;
66
+ return {};
67
+ }
68
+ /**
69
+ * Migrate dot-ai.yml to settings.json.
70
+ * Reads the existing YAML config and writes a settings.json equivalent.
71
+ * Returns the path of the written file, or null if no YAML config exists.
72
+ */
73
+ export async function migrateConfig(workspaceRoot) {
74
+ const ymlPath = join(workspaceRoot, '.ai', 'dot-ai.yml');
41
75
  let raw;
42
76
  try {
43
- raw = await readFile(configPath, 'utf-8');
77
+ raw = await readFile(ymlPath, 'utf-8');
44
78
  }
45
79
  catch {
46
- // No config file — return empty config (all defaults)
47
- return {};
80
+ return null; // No YAML config to migrate
48
81
  }
49
- return parseYaml(raw);
50
- }
51
- export function resolveConfig(config) {
52
- return {
53
- memory: config.memory ?? { use: '@dot-ai/provider-file-memory' },
54
- skills: config.skills ?? { use: '@dot-ai/provider-file-skills' },
55
- identity: config.identity ?? { use: '@dot-ai/provider-file-identity' },
56
- routing: config.routing ?? { use: '@dot-ai/provider-rules-routing' },
57
- tasks: config.tasks ?? { use: '@dot-ai/provider-file-tasks' },
58
- tools: config.tools ?? { use: '@dot-ai/provider-file-tools' },
59
- debug: config.debug,
60
- };
82
+ // Extract extensions section from YAML if present
83
+ const config = {};
84
+ const extensions = parseExtensionsFromYaml(raw);
85
+ if (extensions) {
86
+ config.extensions = extensions;
87
+ }
88
+ const settings = configToSettingsJson(config);
89
+ const settingsPath = join(workspaceRoot, '.ai', 'settings.json');
90
+ const { writeFile: wf } = await import('node:fs/promises');
91
+ await wf(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
92
+ return settingsPath;
61
93
  }
62
- function stripQuotes(s) {
63
- if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
64
- return s.slice(1, -1);
94
+ /**
95
+ * Convert DotAiConfig to Pi-compatible settings.json format.
96
+ */
97
+ function configToSettingsJson(config) {
98
+ const settings = {};
99
+ if (config.extensions?.paths?.length) {
100
+ settings['extensions'] = config.extensions.paths;
65
101
  }
66
- return s;
102
+ if (config.extensions?.packages?.length) {
103
+ settings['packages'] = config.extensions.packages;
104
+ }
105
+ if (config.debug)
106
+ settings['debug'] = config.debug;
107
+ if (config.workspace)
108
+ settings['workspace'] = config.workspace;
109
+ return settings;
67
110
  }
68
- function parseYaml(raw) {
111
+ /**
112
+ * Parse extensions section from legacy YAML config.
113
+ */
114
+ function parseExtensionsFromYaml(raw) {
115
+ const extensions = {};
69
116
  const lines = raw.split('\n');
70
- const result = {};
71
- let currentSection = null;
117
+ let inExtensions = false;
118
+ let currentKey = null;
72
119
  for (const line of lines) {
73
- // Skip comments and empty lines
74
- if (line.trim().startsWith('#') || line.trim() === '')
75
- continue;
76
- // Top-level key (no indent)
77
- const topMatch = line.match(/^(\w+):$/);
78
- if (topMatch) {
79
- currentSection = topMatch[1];
80
- result[currentSection] = {};
120
+ if (line.match(/^extensions:$/)) {
121
+ inExtensions = true;
81
122
  continue;
82
123
  }
83
- // Nested key: value (2-space indent)
84
- const nestedMatch = line.match(/^ (\w+):\s*(.+)$/);
85
- if (nestedMatch && currentSection) {
86
- const section = result[currentSection];
87
- let value = stripQuotes(nestedMatch[2].trim());
88
- // Resolve ${ENV_VAR} references
89
- value = value.replace(/\$\{(\w+)\}/g, (_, name) => process.env[name] ?? '');
90
- section[nestedMatch[1]] = value;
124
+ if (inExtensions && line.match(/^\w+:/) && !line.match(/^extensions:/)) {
125
+ break;
126
+ }
127
+ if (!inExtensions)
128
+ continue;
129
+ const inlineArrayMatch = line.match(/^\s{2}(\w+):\s*\[(.+)\]$/);
130
+ if (inlineArrayMatch) {
131
+ const key = inlineArrayMatch[1];
132
+ const items = inlineArrayMatch[2]
133
+ .split(',')
134
+ .map(s => stripQuotes(s.trim()))
135
+ .filter(s => s.length > 0);
136
+ extensions[key] = items;
137
+ currentKey = null;
91
138
  continue;
92
139
  }
93
- // Deeper nested key: value (4-space indent) for 'with' block
94
- const deepMatch = line.match(/^ (\w+):\s*(.+)$/);
95
- if (deepMatch && currentSection) {
96
- const section = result[currentSection];
97
- if (!section['with'] || typeof section['with'] === 'string') {
98
- section['with'] = {};
99
- }
100
- let value = stripQuotes(deepMatch[2].trim());
101
- value = value.replace(/\$\{(\w+)\}/g, (_, name) => process.env[name] ?? '');
102
- section['with'][deepMatch[1]] = value;
140
+ const keyMatch = line.match(/^\s{2}(\w+):$/);
141
+ if (keyMatch) {
142
+ currentKey = keyMatch[1];
143
+ extensions[currentKey] = [];
144
+ continue;
103
145
  }
104
- }
105
- // Convert YamlNode to DotAiConfig
106
- const config = {};
107
- const providerKeys = ['memory', 'skills', 'identity', 'routing', 'tasks', 'tools'];
108
- for (const key of providerKeys) {
109
- const section = result[key];
110
- if (section && typeof section === 'object') {
111
- const node = section;
112
- const providerConfig = {
113
- use: typeof node['use'] === 'string' ? node['use'] : '',
114
- };
115
- if (node['with'] && typeof node['with'] === 'object') {
116
- providerConfig.with = node['with'];
117
- }
118
- config[key] = providerConfig;
146
+ const listItemMatch = line.match(/^\s{4}-\s*(.+)$/);
147
+ if (listItemMatch && currentKey) {
148
+ if (!extensions[currentKey])
149
+ extensions[currentKey] = [];
150
+ extensions[currentKey].push(stripQuotes(listItemMatch[1].trim()));
119
151
  }
120
152
  }
121
- // Parse debug section
122
- const debugSection = result['debug'];
123
- if (debugSection && typeof debugSection === 'object') {
124
- const node = debugSection;
125
- config.debug = {};
126
- if (typeof node['logPath'] === 'string') {
127
- config.debug.logPath = node['logPath'];
128
- }
153
+ if (extensions.paths?.length || extensions.packages?.length) {
154
+ return extensions;
129
155
  }
130
- // Parse workspace section
131
- const workspaceSection = result['workspace'];
132
- if (workspaceSection && typeof workspaceSection === 'object') {
133
- const node = workspaceSection;
134
- config.workspace = {};
135
- if (typeof node['scanDirs'] === 'string') {
136
- config.workspace.scanDirs = node['scanDirs'];
137
- }
156
+ return null;
157
+ }
158
+ function stripQuotes(s) {
159
+ if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
160
+ return s.slice(1, -1);
138
161
  }
139
- return config;
162
+ return s;
140
163
  }
141
164
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { ContextInjectEvent, ContextInjectResult, ContextModifyEvent, ContextModifyResult, ToolCallEvent, ToolCallResult, ToolResultEvent, AgentEndEvent, ToolDefinition, ExtensionContext, ResourcesDiscoverResult, LabelExtractEvent, ContextEnrichEvent, ContextEnrichResult, RouteEvent, RouteResult, InputEvent, InputResult, CommandDefinition } from './extension-types.js';
2
+ import type { Label } from './types.js';
3
+ /**
4
+ * v6 Extension Context — passed as second argument to every event handler.
5
+ * Extends the base ExtensionContext with labels and optional agent capabilities.
6
+ */
7
+ export interface ExtensionContextV6 extends ExtensionContext {
8
+ /** Current prompt labels (available after label_extract) */
9
+ labels: Label[];
10
+ /** Agent capabilities (adapter-provided, may be undefined) */
11
+ agent?: {
12
+ abort(): void;
13
+ getContextUsage(): {
14
+ tokens: number;
15
+ percent: number;
16
+ } | undefined;
17
+ getSystemPrompt(): string;
18
+ [key: string]: unknown;
19
+ };
20
+ }
21
+ /**
22
+ * Extension API — passed to extension factory functions.
23
+ * Pi-compatible: same on(event) + registerTool() + registerCommand() pattern.
24
+ */
25
+ export interface ExtensionAPI {
26
+ /** Resource discovery: extensions declare resources and contribute labels */
27
+ on(event: 'resources_discover', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<ResourcesDiscoverResult | void>): void;
28
+ /** Label extraction: extensions can add custom labels (chain-transform) */
29
+ on(event: 'label_extract', handler: (e: LabelExtractEvent, ctx: ExtensionContextV6) => Promise<Label[] | void>): void;
30
+ /** Context enrichment: extensions return sections for context injection */
31
+ on(event: 'context_enrich', handler: (e: ContextEnrichEvent, ctx: ExtensionContextV6) => Promise<ContextEnrichResult | void>): void;
32
+ /** Model routing: first result wins */
33
+ on(event: 'route', handler: (e: RouteEvent, ctx: ExtensionContextV6) => Promise<RouteResult | void>): void;
34
+ /** Input transformation: extensions can rewrite user input */
35
+ on(event: 'input', handler: (e: InputEvent, ctx: ExtensionContextV6) => Promise<InputResult | void>): void;
36
+ /** Tool call interception: fired before tool execution, can block */
37
+ on(event: 'tool_call', handler: (e: ToolCallEvent, ctx: ExtensionContextV6) => Promise<ToolCallResult | void>): void;
38
+ /** Tool result observation: fired after tool execution */
39
+ on(event: 'tool_result', handler: (e: ToolResultEvent, ctx: ExtensionContextV6) => Promise<void>): void;
40
+ on(event: 'session_start', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
41
+ on(event: 'session_end', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
42
+ on(event: 'agent_start', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
43
+ on(event: 'agent_end', handler: (e: AgentEndEvent, ctx: ExtensionContextV6) => Promise<void>): void;
44
+ on(event: 'turn_start', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
45
+ on(event: 'turn_end', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
46
+ /** @deprecated Use context_enrich instead */
47
+ on(event: 'context_inject', handler: (e: ContextInjectEvent, ctx: ExtensionContextV6) => Promise<ContextInjectResult | void>): void;
48
+ /** @deprecated Use context_enrich instead */
49
+ on(event: 'context_modify', handler: (e: ContextModifyEvent, ctx: ExtensionContextV6) => Promise<ContextModifyResult | void>): void;
50
+ on(event: string, handler: (e: any, ctx: ExtensionContextV6) => Promise<any>): void;
51
+ /** Register a tool that the agent can invoke */
52
+ registerTool(tool: ToolDefinition): void;
53
+ /** Register a command (slash command, etc.) */
54
+ registerCommand(command: CommandDefinition): void;
55
+ events: {
56
+ on(event: string, handler: (...args: unknown[]) => void): void;
57
+ off(event: string, handler: (...args: unknown[]) => void): void;
58
+ emit(event: string, ...args: unknown[]): void;
59
+ };
60
+ /** Extension configuration (from extension-specific config files, env vars, etc.) */
61
+ config: Record<string, unknown>;
62
+ /** Workspace root directory (contains .ai/) */
63
+ workspaceRoot: string;
64
+ }
65
+ //# sourceMappingURL=extension-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-api.d.ts","sourceRoot":"","sources":["../src/extension-api.ts"],"names":[],"mappings":"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"}