@accomplish_ai/agent-core 0.2.0 → 0.2.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 (78) hide show
  1. package/README.md +141 -0
  2. package/dist/common/constants.d.ts +1 -1
  3. package/dist/common/constants.d.ts.map +1 -1
  4. package/dist/common/constants.js +1 -1
  5. package/dist/common/constants.js.map +1 -1
  6. package/dist/common/types/index.d.ts +14 -10
  7. package/dist/common/types/index.d.ts.map +1 -1
  8. package/dist/common/types/index.js +4 -10
  9. package/dist/common/types/index.js.map +1 -1
  10. package/dist/common/utils/index.d.ts +3 -3
  11. package/dist/common/utils/index.d.ts.map +1 -1
  12. package/dist/common/utils/index.js +3 -3
  13. package/dist/common/utils/index.js.map +1 -1
  14. package/dist/factories/speech.d.ts.map +1 -1
  15. package/dist/factories/speech.js.map +1 -1
  16. package/dist/index.d.ts +1 -6
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +8 -20
  19. package/dist/index.js.map +1 -1
  20. package/dist/internal/classes/SecureStorage.d.ts.map +1 -1
  21. package/dist/internal/classes/SecureStorage.js +3 -0
  22. package/dist/internal/classes/SecureStorage.js.map +1 -1
  23. package/dist/internal/classes/TaskManager.d.ts +3 -2
  24. package/dist/internal/classes/TaskManager.d.ts.map +1 -1
  25. package/dist/internal/classes/TaskManager.js +34 -1
  26. package/dist/internal/classes/TaskManager.js.map +1 -1
  27. package/dist/storage/index.d.ts +4 -1
  28. package/dist/storage/index.d.ts.map +1 -1
  29. package/dist/storage/index.js +4 -1
  30. package/dist/storage/index.js.map +1 -1
  31. package/dist/types/log-writer.d.ts +2 -15
  32. package/dist/types/log-writer.d.ts.map +1 -1
  33. package/dist/types/skills-manager.d.ts +13 -0
  34. package/dist/types/skills-manager.d.ts.map +1 -1
  35. package/dist/types/speech.d.ts +3 -2
  36. package/dist/types/speech.d.ts.map +1 -1
  37. package/dist/types/storage.d.ts +70 -0
  38. package/dist/types/storage.d.ts.map +1 -1
  39. package/dist/types/task-manager.d.ts +13 -3
  40. package/dist/types/task-manager.d.ts.map +1 -1
  41. package/dist/types.d.ts +0 -17
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/utils/index.d.ts +16 -13
  44. package/dist/utils/index.d.ts.map +1 -1
  45. package/dist/utils/index.js +13 -13
  46. package/dist/utils/index.js.map +1 -1
  47. package/mcp-tools/dev-browser/server.cjs +144 -0
  48. package/package.json +16 -3
  49. package/mcp-tools/ask-user-question/src/index.ts +0 -183
  50. package/mcp-tools/ask-user-question/tsconfig.json +0 -12
  51. package/mcp-tools/complete-task/src/index.ts +0 -92
  52. package/mcp-tools/dev-browser/src/index.ts +0 -290
  53. package/mcp-tools/dev-browser/src/relay.ts +0 -652
  54. package/mcp-tools/dev-browser/src/types.ts +0 -31
  55. package/mcp-tools/dev-browser/tsconfig.json +0 -36
  56. package/mcp-tools/dev-browser-mcp/src/index.ts +0 -3940
  57. package/mcp-tools/dev-browser-mcp/src/snapshot/compactor.test.ts +0 -86
  58. package/mcp-tools/dev-browser-mcp/src/snapshot/compactor.ts +0 -31
  59. package/mcp-tools/dev-browser-mcp/src/snapshot/differ.test.ts +0 -178
  60. package/mcp-tools/dev-browser-mcp/src/snapshot/differ.ts +0 -167
  61. package/mcp-tools/dev-browser-mcp/src/snapshot/index.ts +0 -19
  62. package/mcp-tools/dev-browser-mcp/src/snapshot/manager.test.ts +0 -247
  63. package/mcp-tools/dev-browser-mcp/src/snapshot/manager.ts +0 -131
  64. package/mcp-tools/dev-browser-mcp/src/snapshot/parser.test.ts +0 -94
  65. package/mcp-tools/dev-browser-mcp/src/snapshot/parser.ts +0 -81
  66. package/mcp-tools/dev-browser-mcp/src/snapshot/priority.test.ts +0 -104
  67. package/mcp-tools/dev-browser-mcp/src/snapshot/priority.ts +0 -84
  68. package/mcp-tools/dev-browser-mcp/src/snapshot/tokens.test.ts +0 -64
  69. package/mcp-tools/dev-browser-mcp/src/snapshot/tokens.ts +0 -36
  70. package/mcp-tools/dev-browser-mcp/src/snapshot/types.ts +0 -89
  71. package/mcp-tools/dev-browser-mcp/tsconfig.json +0 -15
  72. package/mcp-tools/file-permission/src/index.ts +0 -125
  73. package/mcp-tools/file-permission/tsconfig.json +0 -17
  74. package/mcp-tools/report-checkpoint/src/index.ts +0 -127
  75. package/mcp-tools/report-checkpoint/tsconfig.json +0 -12
  76. package/mcp-tools/report-thought/src/index.ts +0 -109
  77. package/mcp-tools/report-thought/tsconfig.json +0 -12
  78. package/mcp-tools/start-task/src/index.ts +0 -86
@@ -1,86 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { hashNavigationPattern, summarizeSession, isSameNavigation } from './compactor';
3
- import type { SnapshotElement, SessionHistoryEntry } from './types';
4
-
5
- describe('compactor', () => {
6
- describe('hashNavigationPattern', () => {
7
- it('should hash navigation elements', () => {
8
- const elements: SnapshotElement[] = [
9
- { ref: 'e1', role: 'navigation', name: 'Main Nav' },
10
- { ref: 'e2', role: 'button', name: 'Click Me' },
11
- { ref: 'e3', role: 'banner', name: 'Header' },
12
- ];
13
-
14
- const hash = hashNavigationPattern(elements);
15
- expect(hash).toHaveLength(8);
16
- });
17
-
18
- it('should return empty string for no nav elements', () => {
19
- const elements: SnapshotElement[] = [
20
- { ref: 'e1', role: 'button', name: 'Click Me' },
21
- ];
22
-
23
- const hash = hashNavigationPattern(elements);
24
- expect(hash).toBe('');
25
- });
26
-
27
- it('should produce same hash for same nav pattern', () => {
28
- const elements1: SnapshotElement[] = [
29
- { ref: 'e1', role: 'navigation', name: 'Main Nav' },
30
- ];
31
- const elements2: SnapshotElement[] = [
32
- { ref: 'e99', role: 'navigation', name: 'Main Nav' },
33
- ];
34
-
35
- expect(hashNavigationPattern(elements1)).toBe(hashNavigationPattern(elements2));
36
- });
37
- });
38
-
39
- describe('summarizeSession', () => {
40
- it('should return empty for no history', () => {
41
- expect(summarizeSession([])).toBe('');
42
- });
43
-
44
- it('should format single page', () => {
45
- const history: SessionHistoryEntry[] = [
46
- { url: 'https://example.com', title: 'Home', timestamp: Date.now(), actionsTaken: [] },
47
- ];
48
- expect(summarizeSession(history)).toBe('Currently on: Home');
49
- });
50
-
51
- it('should format multiple pages with arrows', () => {
52
- const history: SessionHistoryEntry[] = [
53
- { url: 'https://example.com', title: 'Home', timestamp: Date.now(), actionsTaken: [] },
54
- { url: 'https://example.com/about', title: 'About', timestamp: Date.now(), actionsTaken: [] },
55
- ];
56
- expect(summarizeSession(history)).toBe('Navigation: Home → About');
57
- });
58
-
59
- it('should limit to 5 most recent', () => {
60
- const history: SessionHistoryEntry[] = Array.from({ length: 10 }, (_, i) => ({
61
- url: `https://example.com/page${i}`,
62
- title: `Page ${i}`,
63
- timestamp: Date.now(),
64
- actionsTaken: [],
65
- }));
66
-
67
- const summary = summarizeSession(history);
68
- expect(summary).not.toContain('Page 0');
69
- expect(summary).toContain('Page 9');
70
- });
71
- });
72
-
73
- describe('isSameNavigation', () => {
74
- it('should return true for matching hashes', () => {
75
- expect(isSameNavigation('abc12345', 'abc12345')).toBe(true);
76
- });
77
-
78
- it('should return false for empty hashes', () => {
79
- expect(isSameNavigation('', '')).toBe(false);
80
- });
81
-
82
- it('should return false for different hashes', () => {
83
- expect(isSameNavigation('abc12345', 'xyz67890')).toBe(false);
84
- });
85
- });
86
- });
@@ -1,31 +0,0 @@
1
- import { createHash } from 'crypto';
2
- import type { SnapshotElement, SessionHistoryEntry } from './types';
3
-
4
- export function hashNavigationPattern(elements: SnapshotElement[]): string {
5
- const navElements = elements.filter(e =>
6
- e.role === 'navigation' ||
7
- e.role === 'banner' ||
8
- e.role === 'contentinfo'
9
- );
10
-
11
- if (navElements.length === 0) return '';
12
-
13
- const signature = navElements
14
- .map(e => `${e.role}:${e.name ?? ''}`)
15
- .sort()
16
- .join('|');
17
-
18
- return createHash('md5').update(signature).digest('hex').slice(0, 8);
19
- }
20
-
21
- export function summarizeSession(history: SessionHistoryEntry[]): string {
22
- if (history.length === 0) return '';
23
- if (history.length === 1) return `Currently on: ${history[0].title || 'Page'}`;
24
-
25
- const recent = history.slice(-5);
26
- return `Navigation: ${recent.map(h => h.title || 'Page').join(' → ')}`;
27
- }
28
-
29
- export function isSameNavigation(hash1: string, hash2: string): boolean {
30
- return hash1 !== '' && hash1 === hash2;
31
- }
@@ -1,178 +0,0 @@
1
- // packages/core/mcp-tools/dev-browser-mcp/src/snapshot/differ.test.ts
2
-
3
- import { describe, it, expect } from 'vitest';
4
- import { diffSnapshots, formatDiff, compressRefList } from './differ.js';
5
- import type { ParsedSnapshot, SnapshotElement } from './types.js';
6
-
7
- function createSnapshot(elements: SnapshotElement[]): ParsedSnapshot {
8
- const map = new Map<string, SnapshotElement>();
9
- for (const el of elements) {
10
- map.set(el.ref, el);
11
- }
12
- return {
13
- url: 'https://example.com',
14
- title: 'Test Page',
15
- timestamp: Date.now(),
16
- elements: map,
17
- rawYaml: '',
18
- };
19
- }
20
-
21
- describe('diffSnapshots', () => {
22
- it('returns empty diff for identical snapshots', () => {
23
- const elements: SnapshotElement[] = [
24
- { ref: 'e1', role: 'button', name: 'Submit' },
25
- { ref: 'e2', role: 'textbox', name: 'Email' },
26
- ];
27
- const snapshot1 = createSnapshot(elements);
28
- const snapshot2 = createSnapshot(elements);
29
-
30
- const diff = diffSnapshots(snapshot1, snapshot2);
31
-
32
- expect(diff).not.toBeNull();
33
- expect(diff!.unchangedRefs).toEqual(['e1', 'e2']);
34
- expect(diff!.changes).toHaveLength(0);
35
- });
36
-
37
- it('detects added elements', () => {
38
- const prev = createSnapshot([
39
- { ref: 'e1', role: 'button', name: 'Submit' },
40
- ]);
41
- const curr = createSnapshot([
42
- { ref: 'e1', role: 'button', name: 'Submit' },
43
- { ref: 'e2', role: 'textbox', name: 'Email' },
44
- ]);
45
-
46
- const diff = diffSnapshots(prev, curr);
47
-
48
- expect(diff!.addedRefs).toContain('e2');
49
- expect(diff!.changes.find(c => c.ref === 'e2')?.changeType).toBe('added');
50
- });
51
-
52
- it('detects removed elements', () => {
53
- // Need enough unchanged elements to stay below 70% change threshold
54
- const prev = createSnapshot([
55
- { ref: 'e1', role: 'button', name: 'Submit' },
56
- { ref: 'e2', role: 'textbox', name: 'Email' },
57
- { ref: 'e3', role: 'heading', name: 'Title' },
58
- { ref: 'e4', role: 'paragraph', name: 'Description' },
59
- ]);
60
- const curr = createSnapshot([
61
- { ref: 'e1', role: 'button', name: 'Submit' },
62
- { ref: 'e3', role: 'heading', name: 'Title' },
63
- { ref: 'e4', role: 'paragraph', name: 'Description' },
64
- ]);
65
-
66
- const diff = diffSnapshots(prev, curr);
67
-
68
- expect(diff).not.toBeNull();
69
- expect(diff!.removedRefs).toContain('e2');
70
- expect(diff!.changes.find(c => c.ref === 'e2')?.changeType).toBe('removed');
71
- });
72
-
73
- it('detects value changes', () => {
74
- // Need enough unchanged elements to stay below 70% change threshold
75
- const prev = createSnapshot([
76
- { ref: 'e1', role: 'textbox', name: 'Email', value: '' },
77
- { ref: 'e2', role: 'button', name: 'Submit' },
78
- { ref: 'e3', role: 'heading', name: 'Title' },
79
- { ref: 'e4', role: 'paragraph', name: 'Description' },
80
- ]);
81
- const curr = createSnapshot([
82
- { ref: 'e1', role: 'textbox', name: 'Email', value: 'user@example.com' },
83
- { ref: 'e2', role: 'button', name: 'Submit' },
84
- { ref: 'e3', role: 'heading', name: 'Title' },
85
- { ref: 'e4', role: 'paragraph', name: 'Description' },
86
- ]);
87
-
88
- const diff = diffSnapshots(prev, curr);
89
-
90
- expect(diff).not.toBeNull();
91
- expect(diff!.changes).toHaveLength(1);
92
- expect(diff!.changes[0].changeType).toBe('modified');
93
- expect(diff!.changes[0].previousValue).toBe('');
94
- expect(diff!.changes[0].element.value).toBe('user@example.com');
95
- });
96
-
97
- it('detects disabled state changes', () => {
98
- // Need enough unchanged elements to stay below 70% change threshold
99
- const prev = createSnapshot([
100
- { ref: 'e1', role: 'button', name: 'Submit', disabled: true },
101
- { ref: 'e2', role: 'textbox', name: 'Email' },
102
- { ref: 'e3', role: 'heading', name: 'Title' },
103
- { ref: 'e4', role: 'paragraph', name: 'Description' },
104
- ]);
105
- const curr = createSnapshot([
106
- { ref: 'e1', role: 'button', name: 'Submit', disabled: false },
107
- { ref: 'e2', role: 'textbox', name: 'Email' },
108
- { ref: 'e3', role: 'heading', name: 'Title' },
109
- { ref: 'e4', role: 'paragraph', name: 'Description' },
110
- ]);
111
-
112
- const diff = diffSnapshots(prev, curr);
113
-
114
- expect(diff).not.toBeNull();
115
- expect(diff!.changes).toHaveLength(1);
116
- expect(diff!.changes[0].previousDisabled).toBe(true);
117
- });
118
-
119
- it('returns null when >70% changed', () => {
120
- const prev = createSnapshot([
121
- { ref: 'e1', role: 'button', name: 'A' },
122
- { ref: 'e2', role: 'button', name: 'B' },
123
- { ref: 'e3', role: 'button', name: 'C' },
124
- ]);
125
- const curr = createSnapshot([
126
- { ref: 'e1', role: 'button', name: 'X' },
127
- { ref: 'e2', role: 'button', name: 'Y' },
128
- { ref: 'e3', role: 'button', name: 'Z' },
129
- ]);
130
-
131
- const diff = diffSnapshots(prev, curr);
132
-
133
- expect(diff).toBeNull();
134
- });
135
- });
136
-
137
- describe('compressRefList', () => {
138
- it('compresses consecutive refs into ranges', () => {
139
- expect(compressRefList(['e1', 'e2', 'e3', 'e5', 'e6', 'e10'])).toBe('e1-e3, e5-e6, e10');
140
- });
141
-
142
- it('handles single refs', () => {
143
- expect(compressRefList(['e1'])).toBe('e1');
144
- });
145
-
146
- it('handles empty array', () => {
147
- expect(compressRefList([])).toBe('');
148
- });
149
-
150
- it('handles non-consecutive refs', () => {
151
- expect(compressRefList(['e1', 'e5', 'e10'])).toBe('e1, e5, e10');
152
- });
153
- });
154
-
155
- describe('formatDiff', () => {
156
- it('formats diff with header and changes', () => {
157
- const diff = {
158
- unchangedRefs: ['e1', 'e2', 'e3'],
159
- changes: [
160
- {
161
- ref: 'e4',
162
- element: { ref: 'e4', role: 'textbox', name: 'Email', value: 'test@example.com' },
163
- previousValue: '',
164
- changeType: 'modified' as const,
165
- },
166
- ],
167
- addedRefs: [],
168
- removedRefs: [],
169
- };
170
-
171
- const formatted = formatDiff(diff, 'https://example.com', 'Login Page');
172
-
173
- expect(formatted).toContain('[Same page: Login Page]');
174
- expect(formatted).toContain('[URL: https://example.com]');
175
- expect(formatted).toContain('[Unchanged: e1-e3]');
176
- expect(formatted).toContain('ref: e4');
177
- });
178
- });
@@ -1,167 +0,0 @@
1
- import type { ParsedSnapshot, SnapshotDiff, ElementChange, SnapshotElement } from './types.js';
2
-
3
- export function diffSnapshots(
4
- previous: ParsedSnapshot,
5
- current: ParsedSnapshot
6
- ): SnapshotDiff | null {
7
- const unchangedRefs: string[] = [];
8
- const changes: ElementChange[] = [];
9
- const addedRefs: string[] = [];
10
- const removedRefs: string[] = [];
11
-
12
- for (const [ref, currentEl] of current.elements) {
13
- const previousEl = previous.elements.get(ref);
14
-
15
- if (!previousEl) {
16
- addedRefs.push(ref);
17
- changes.push({
18
- ref,
19
- element: currentEl,
20
- changeType: 'added',
21
- });
22
- } else if (hasElementChanged(previousEl, currentEl)) {
23
- changes.push({
24
- ref,
25
- element: currentEl,
26
- previousValue: previousEl.value,
27
- previousChecked: previousEl.checked,
28
- previousDisabled: previousEl.disabled,
29
- previousExpanded: previousEl.expanded,
30
- previousSelected: previousEl.selected,
31
- changeType: 'modified',
32
- });
33
- } else {
34
- unchangedRefs.push(ref);
35
- }
36
- }
37
-
38
- for (const [ref, previousEl] of previous.elements) {
39
- if (!current.elements.has(ref)) {
40
- removedRefs.push(ref);
41
- changes.push({
42
- ref,
43
- element: previousEl,
44
- changeType: 'removed',
45
- });
46
- }
47
- }
48
-
49
- const totalElements = current.elements.size;
50
- const changedCount = changes.length;
51
- if (totalElements > 0 && changedCount / totalElements > 0.7) {
52
- return null;
53
- }
54
-
55
- return {
56
- unchangedRefs,
57
- changes,
58
- addedRefs,
59
- removedRefs,
60
- };
61
- }
62
-
63
- function hasElementChanged(previous: SnapshotElement, current: SnapshotElement): boolean {
64
- return (
65
- previous.role !== current.role ||
66
- previous.name !== current.name ||
67
- previous.value !== current.value ||
68
- previous.checked !== current.checked ||
69
- previous.disabled !== current.disabled ||
70
- previous.expanded !== current.expanded ||
71
- previous.selected !== current.selected ||
72
- previous.pressed !== current.pressed
73
- );
74
- }
75
-
76
- export function formatDiff(
77
- diff: SnapshotDiff,
78
- url: string,
79
- title: string
80
- ): string {
81
- const lines: string[] = [];
82
-
83
- lines.push(`[Same page: ${title}]`);
84
- lines.push(`[URL: ${url}]`);
85
-
86
- if (diff.unchangedRefs.length > 0) {
87
- const compressed = compressRefList(diff.unchangedRefs);
88
- lines.push(`[Unchanged: ${compressed}]`);
89
- }
90
-
91
- lines.push('');
92
-
93
- if (diff.changes.length > 0) {
94
- lines.push('Changed:');
95
- for (const change of diff.changes) {
96
- lines.push(formatChange(change));
97
- }
98
- } else {
99
- lines.push('[No changes detected]');
100
- }
101
-
102
- lines.push('');
103
- lines.push('[Tip: Use browser_snapshot(full_snapshot=true) if elements seem incorrect]');
104
-
105
- return lines.join('\n');
106
- }
107
-
108
- function formatChange(change: ElementChange): string {
109
- const { ref, element, changeType } = change;
110
- const lines: string[] = [];
111
-
112
- const prefix = changeType === 'added' ? '+ ' : changeType === 'removed' ? '- ' : '';
113
- let line = `${prefix}ref: ${ref}`;
114
- line += ` role: ${element.role}`;
115
- if (element.name) {
116
- line += ` name: "${element.name}"`;
117
- }
118
-
119
- lines.push(line);
120
-
121
- if (changeType === 'modified') {
122
- if (element.value !== undefined && element.value !== change.previousValue) {
123
- lines.push(` value: "${element.value}" # was: "${change.previousValue || ''}"`);
124
- }
125
- if (element.disabled !== undefined && element.disabled !== change.previousDisabled) {
126
- lines.push(` disabled: ${element.disabled} # was: ${change.previousDisabled || false}`);
127
- }
128
- if (element.checked !== undefined && element.checked !== change.previousChecked) {
129
- lines.push(` checked: ${element.checked} # was: ${change.previousChecked || false}`);
130
- }
131
- if (element.expanded !== undefined && element.expanded !== change.previousExpanded) {
132
- lines.push(` expanded: ${element.expanded} # was: ${change.previousExpanded || false}`);
133
- }
134
- if (element.selected !== undefined && element.selected !== change.previousSelected) {
135
- lines.push(` selected: ${element.selected} # was: ${change.previousSelected || false}`);
136
- }
137
- } else if (changeType === 'added' && element.value) {
138
- lines.push(` value: "${element.value}"`);
139
- }
140
-
141
- return lines.join('\n');
142
- }
143
-
144
- export function compressRefList(refs: string[]): string {
145
- if (refs.length === 0) return '';
146
-
147
- const numbers = refs
148
- .map(ref => parseInt(ref.replace('e', ''), 10))
149
- .sort((a, b) => a - b);
150
-
151
- const ranges: string[] = [];
152
- let rangeStart = numbers[0];
153
- let rangeEnd = numbers[0];
154
-
155
- for (let i = 1; i < numbers.length; i++) {
156
- if (numbers[i] === rangeEnd + 1) {
157
- rangeEnd = numbers[i];
158
- } else {
159
- ranges.push(rangeStart === rangeEnd ? `e${rangeStart}` : `e${rangeStart}-e${rangeEnd}`);
160
- rangeStart = numbers[i];
161
- rangeEnd = numbers[i];
162
- }
163
- }
164
- ranges.push(rangeStart === rangeEnd ? `e${rangeStart}` : `e${rangeStart}-e${rangeEnd}`);
165
-
166
- return ranges.join(', ');
167
- }
@@ -1,19 +0,0 @@
1
- export type {
2
- SnapshotElement,
3
- ParsedSnapshot,
4
- ElementChange,
5
- SnapshotDiff,
6
- SnapshotResult,
7
- } from './types.js';
8
-
9
- export { parseSnapshot, extractTitleFromSnapshot } from './parser.js';
10
- export { diffSnapshots, formatDiff, compressRefList } from './differ.js';
11
- export {
12
- SnapshotManager,
13
- getSnapshotManager,
14
- resetSnapshotManager,
15
- type SnapshotManagerOptions,
16
- } from './manager.js';
17
- export * from './tokens.js';
18
- export * from './priority.js';
19
- export * from './compactor.js';