@hanhnd/agent-kit 1.0.32 → 1.0.34

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 (111) hide show
  1. package/dist/cli/commands/cli-digest-pending.test.js +111 -0
  2. package/dist/cli/commands/cli-memory.test.js +34 -0
  3. package/dist/cli/{memory.js → commands/memory.js} +24 -11
  4. package/dist/cli/index.js +2 -2
  5. package/dist/{utils → cli/utils}/args.d.ts +2 -1
  6. package/dist/{kit-cli.js → cli.js} +342 -58
  7. package/dist/{tools/config.d.ts → core/config/index.d.ts} +2 -7
  8. package/dist/{tools/config.js → core/config/index.js} +2 -13
  9. package/dist/core/handoffs/index.d.ts +17 -0
  10. package/dist/{tools/handoffs.js → core/handoffs/index.js} +15 -7
  11. package/dist/core/handoffs/index.test.js +88 -0
  12. package/dist/{tools/security.d.ts → core/security/index.d.ts} +0 -19
  13. package/dist/{tools/security.js → core/security/index.js} +3 -76
  14. package/dist/entrypoints/cli.js +11 -0
  15. package/dist/entrypoints/server.js +37 -0
  16. package/dist/{tools → mcp}/agent.d.ts +1 -1
  17. package/dist/{tools → mcp}/agent.js +4 -4
  18. package/dist/mcp/core.d.ts +17 -0
  19. package/dist/mcp/core.js +60 -0
  20. package/dist/mcp/core.test.js +98 -0
  21. package/dist/{tools → mcp}/integration.js +3 -3
  22. package/dist/mcp/memory.d.ts +15 -0
  23. package/dist/{tools → mcp}/memory.js +15 -13
  24. package/dist/{kit-server.js → server.js} +129 -98
  25. package/dist/services/digest/background.d.ts +11 -0
  26. package/dist/services/digest/background.js +258 -0
  27. package/dist/{memory → services}/digest/constants.d.ts +4 -1
  28. package/dist/{memory → services}/digest/constants.js +6 -2
  29. package/dist/services/digest/digest-background.test.js +206 -0
  30. package/dist/{tools/__tests__ → services/digest}/digest-init.test.js +4 -3
  31. package/dist/{memory/__tests__ → services/digest}/digest-llama-local.test.js +1 -13
  32. package/dist/{memory/__tests__ → services/digest}/digest-pending.test.js +39 -11
  33. package/dist/{memory/__tests__ → services/digest}/digest-processor.test.js +5 -7
  34. package/dist/{memory → services}/digest/files.d.ts +0 -1
  35. package/dist/{memory → services}/digest/files.js +2 -2
  36. package/dist/services/digest/model-registry.d.ts +2 -0
  37. package/dist/{memory → services}/digest/model-registry.js +9 -8
  38. package/dist/services/digest/processor.d.ts +13 -0
  39. package/dist/{memory → services}/digest/processor.js +48 -31
  40. package/dist/services/digest/providers/llama-local.d.ts +2 -0
  41. package/dist/{memory → services}/digest/providers/llama-local.js +3 -4
  42. package/dist/{memory → services}/digest/types.d.ts +34 -2
  43. package/dist/services/digest/types.js +6 -0
  44. package/dist/{memory → services}/digest/worker.d.ts +0 -1
  45. package/dist/{memory → services}/digest/worker.js +2 -2
  46. package/dist/{utils → services/integration}/credentials.js +1 -1
  47. package/dist/{utils/parser.js → services/integration/parser/adf.js} +1 -0
  48. package/dist/{memory → services/memory}/chunker.d.ts +0 -2
  49. package/dist/{memory → services/memory}/chunker.js +3 -3
  50. package/dist/{memory/__tests__ → services/memory}/chunker.test.js +1 -34
  51. package/dist/{memory → services/memory}/constants.d.ts +1 -1
  52. package/dist/{memory → services/memory}/constants.js +2 -1
  53. package/dist/{memory → services/memory}/embedder.d.ts +2 -2
  54. package/dist/{memory → services/memory}/embedder.js +5 -5
  55. package/dist/services/memory/embedder.test.js +13 -0
  56. package/dist/{memory → services/memory}/indexer.d.ts +2 -1
  57. package/dist/{memory → services/memory}/indexer.js +1 -1
  58. package/dist/{memory/__tests__ → services/memory}/indexer.test.js +4 -3
  59. package/dist/{tools/__tests__ → services/memory}/memory.test.js +54 -13
  60. package/dist/{memory/__tests__ → services/memory}/store.test.js +3 -2
  61. package/dist/{memory → services/memory}/types.d.ts +7 -2
  62. package/dist/services/memory/types.js +6 -0
  63. package/dist/utils/files.d.ts +0 -1
  64. package/dist/utils/files.js +1 -1
  65. package/dist/{memory/__tests__/lockfile.test.js → utils/files.test.js} +14 -14
  66. package/dist/utils/index.d.ts +6 -0
  67. package/dist/utils/index.js +6 -0
  68. package/dist/utils/json.d.ts +0 -1
  69. package/dist/utils/json.js +0 -10
  70. package/dist/utils/paths.d.ts +0 -1
  71. package/dist/utils/paths.js +1 -1
  72. package/package.json +6 -6
  73. package/dist/memory/__tests__/digest-worker.test.js +0 -46
  74. package/dist/memory/__tests__/embedder.test.js +0 -14
  75. package/dist/memory/digest/model-registry.d.ts +0 -6
  76. package/dist/memory/digest/processor.d.ts +0 -7
  77. package/dist/memory/digest/providers/llama-local.d.ts +0 -7
  78. package/dist/tools/__tests__/cli-digest-pending.test.js +0 -51
  79. package/dist/tools/__tests__/cli-memory.test.js +0 -22
  80. package/dist/tools/core.d.ts +0 -10
  81. package/dist/tools/core.js +0 -46
  82. package/dist/tools/handoffs.d.ts +0 -22
  83. package/dist/tools/memory.d.ts +0 -16
  84. /package/dist/{tools/__tests__ → cli/commands}/cli-digest-pending.test.d.ts +0 -0
  85. /package/dist/{tools/__tests__ → cli/commands}/cli-memory.test.d.ts +0 -0
  86. /package/dist/cli/{memory.d.ts → commands/memory.d.ts} +0 -0
  87. /package/dist/{utils → cli/utils}/args.js +0 -0
  88. /package/dist/{memory/__tests__/chunker.test.d.ts → core/handoffs/index.test.d.ts} +0 -0
  89. /package/dist/{kit-cli.d.ts → entrypoints/cli.d.ts} +0 -0
  90. /package/dist/{kit-server.d.ts → entrypoints/server.d.ts} +0 -0
  91. /package/dist/{memory/__tests__/digest-llama-local.test.d.ts → mcp/core.test.d.ts} +0 -0
  92. /package/dist/{tools → mcp}/integration.d.ts +0 -0
  93. /package/dist/{memory/__tests__/digest-pending.test.d.ts → services/digest/digest-background.test.d.ts} +0 -0
  94. /package/dist/{tools/__tests__ → services/digest}/digest-init.test.d.ts +0 -0
  95. /package/dist/{memory/__tests__/digest-processor.test.d.ts → services/digest/digest-llama-local.test.d.ts} +0 -0
  96. /package/dist/{memory/__tests__/digest-worker.test.d.ts → services/digest/digest-pending.test.d.ts} +0 -0
  97. /package/dist/{memory/__tests__/embedder.test.d.ts → services/digest/digest-processor.test.d.ts} +0 -0
  98. /package/dist/{utils → services/integration}/credentials.d.ts +0 -0
  99. /package/dist/{utils/parser.d.ts → services/integration/parser/adf.d.ts} +0 -0
  100. /package/dist/{memory/__tests__/indexer.test.d.ts → services/memory/chunker.test.d.ts} +0 -0
  101. /package/dist/{memory/__tests__/lockfile.test.d.ts → services/memory/embedder.test.d.ts} +0 -0
  102. /package/dist/{memory → services/memory}/index.d.ts +0 -0
  103. /package/dist/{memory → services/memory}/index.js +0 -0
  104. /package/dist/{memory/__tests__/store.test.d.ts → services/memory/indexer.test.d.ts} +0 -0
  105. /package/dist/{tools/__tests__ → services/memory}/memory.test.d.ts +0 -0
  106. /package/dist/{memory → services/memory}/store.d.ts +0 -0
  107. /package/dist/{memory → services/memory}/store.js +0 -0
  108. /package/dist/{memory/digest/types.js → services/memory/store.test.d.ts} +0 -0
  109. /package/dist/{memory/types.js → utils/files.test.d.ts} +0 -0
  110. /package/dist/{__tests__/temp-dir.d.ts → utils/temp-dir.test.d.ts} +0 -0
  111. /package/dist/{__tests__/temp-dir.js → utils/temp-dir.test.js} +0 -0
@@ -0,0 +1,111 @@
1
+ import * as assert from 'node:assert/strict';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { afterEach, describe, test } from 'node:test';
5
+ import { createTempDirTracker } from '../../utils/temp-dir.test.js';
6
+ import { runMemoryCli } from './memory.js';
7
+ import { writeConversationDigestSettings } from '../../services/digest/files.js';
8
+ import { DigestModelId } from '../../services/digest/types.js';
9
+ const tempDirs = createTempDirTracker();
10
+ afterEach(() => {
11
+ tempDirs.cleanup();
12
+ });
13
+ function writeInitState(workspace) {
14
+ writeConversationDigestSettings(workspace, {
15
+ enabled: true,
16
+ initialized: true,
17
+ modelId: DigestModelId.DEFAULT,
18
+ initializedAt: new Date().toISOString(),
19
+ });
20
+ }
21
+ async function captureStdout(fn) {
22
+ const stdoutChunks = [];
23
+ const origWrite = process.stdout.write.bind(process.stdout);
24
+ process.stdout.write = (chunk) => {
25
+ stdoutChunks.push(String(chunk));
26
+ return true;
27
+ };
28
+ try {
29
+ const code = await fn();
30
+ return { code, output: stdoutChunks.join('') };
31
+ }
32
+ finally {
33
+ process.stdout.write = origWrite;
34
+ }
35
+ }
36
+ async function withWorkspace(workspace, fn) {
37
+ const previous = process.env.WORKSPACE_DIR;
38
+ process.env.WORKSPACE_DIR = workspace;
39
+ try {
40
+ return await fn();
41
+ }
42
+ finally {
43
+ if (previous === undefined) {
44
+ delete process.env.WORKSPACE_DIR;
45
+ }
46
+ else {
47
+ process.env.WORKSPACE_DIR = previous;
48
+ }
49
+ }
50
+ }
51
+ describe('cmdDigestPending CLI', () => {
52
+ test('digest-pending returns 0 and emits one JSON line matching DigestPendingResult', async () => {
53
+ const workspace = tempDirs.makeTempDir('cli-pending-c23-');
54
+ const { code, output } = await withWorkspace(workspace, () => captureStdout(() => runMemoryCli(['digest-pending'], {
55
+ ...process.env,
56
+ WORKSPACE_DIR: workspace,
57
+ })));
58
+ assert.equal(code, 0);
59
+ const parsed = JSON.parse(output.trim());
60
+ assert.ok('ok' in parsed, 'result must have ok field');
61
+ assert.ok('action' in parsed, 'result must have action field');
62
+ });
63
+ test('--background returns launcher JSON without waiting for worker when no pending', async () => {
64
+ const workspace = tempDirs.makeTempDir('cli-pending-bg-');
65
+ writeInitState(workspace);
66
+ const { code, output } = await withWorkspace(workspace, () => captureStdout(() => runMemoryCli(['digest-pending', '--background'], {
67
+ ...process.env,
68
+ WORKSPACE_DIR: workspace,
69
+ })));
70
+ assert.equal(code, 0);
71
+ const parsed = JSON.parse(output.trim());
72
+ assert.equal(parsed.mode, 'background-launcher');
73
+ assert.equal(parsed.spawned, false);
74
+ assert.equal(parsed.status.state, 'no-pending');
75
+ });
76
+ test('--background worker flag returns final worker status JSON', async () => {
77
+ const workspace = tempDirs.makeTempDir('cli-pending-worker-');
78
+ writeInitState(workspace);
79
+ const { code, output } = await withWorkspace(workspace, () => captureStdout(() => runMemoryCli(['digest-pending', '--background', '--__agent-kit-digest-worker'], {
80
+ ...process.env,
81
+ WORKSPACE_DIR: workspace,
82
+ })));
83
+ assert.equal(code, 0);
84
+ const parsed = JSON.parse(output.trim());
85
+ assert.equal(parsed.state, 'no-pending');
86
+ assert.equal(fs.existsSync(path.join(workspace, '.agent-kit', 'wiki', 'digest', 'digest-worker.status.json')), true);
87
+ });
88
+ test('--background emits failed launcher JSON quickly when spawn preflight cannot find entrypoint', async () => {
89
+ const workspace = tempDirs.makeTempDir('cli-pending-bg-fast-');
90
+ writeInitState(workspace);
91
+ const rawDir = path.join(workspace, '.agent-kit', 'wiki', 'raw');
92
+ fs.mkdirSync(rawDir, { recursive: true });
93
+ fs.writeFileSync(path.join(rawDir, 'conv_2026-01-01T00-00-00-001Z.md'), '**User:** hello\n', 'utf8');
94
+ const previousArgv = process.argv[1];
95
+ process.argv[1] = '';
96
+ try {
97
+ const { code, output } = await withWorkspace(workspace, () => captureStdout(() => runMemoryCli(['digest-pending', '--background'], {
98
+ ...process.env,
99
+ WORKSPACE_DIR: workspace,
100
+ })));
101
+ assert.equal(code, 0);
102
+ const parsed = JSON.parse(output.trim());
103
+ assert.equal(parsed.mode, 'background-launcher');
104
+ assert.equal(parsed.spawned, false);
105
+ assert.equal(parsed.status.state, 'failed');
106
+ }
107
+ finally {
108
+ process.argv[1] = previousArgv;
109
+ }
110
+ });
111
+ });
@@ -0,0 +1,34 @@
1
+ import * as assert from 'node:assert/strict';
2
+ import { afterEach, describe, test } from 'node:test';
3
+ import { createTempDirTracker } from '../../utils/temp-dir.test.js';
4
+ import { runMemoryCli } from './memory.js';
5
+ const tempDirs = createTempDirTracker();
6
+ afterEach(() => {
7
+ tempDirs.cleanup();
8
+ });
9
+ describe('memory CLI', () => {
10
+ test('digest-pending returns 0 when settings are missing', async () => {
11
+ const workspace = tempDirs.makeTempDir('digest-pending-');
12
+ const previous = process.env.WORKSPACE_DIR;
13
+ process.env.WORKSPACE_DIR = workspace;
14
+ try {
15
+ const code = await runMemoryCli(['digest-pending'], {
16
+ ...process.env,
17
+ WORKSPACE_DIR: workspace,
18
+ });
19
+ assert.equal(code, 0);
20
+ }
21
+ finally {
22
+ if (previous === undefined) {
23
+ delete process.env.WORKSPACE_DIR;
24
+ }
25
+ else {
26
+ process.env.WORKSPACE_DIR = previous;
27
+ }
28
+ }
29
+ });
30
+ test('unknown command returns 1', async () => {
31
+ const code = await runMemoryCli(['unknown'], process.env);
32
+ assert.equal(code, 1);
33
+ });
34
+ });
@@ -1,9 +1,10 @@
1
- import { initializeConversationDigestModel, digestConversationFile, digestPendingConversations, } from '../memory/digest/processor.js';
2
- import { isDigestWorkerInvocation, runDigestFileInWorker } from '../memory/digest/worker.js';
3
- import { DEFAULT_DIGEST_MAX_INPUT_CHARS, DEFAULT_DIGEST_MODEL_ID, DEFAULT_DIGEST_TIMEOUT_MS, DIGEST_WORKER_RESULT_PREFIX, } from '../memory/digest/constants.js';
4
- import { loadProjectSettings, resolveConversationDigestConfig } from '../tools/config.js';
1
+ import { initializeConversationDigestModel, digestConversationFile, digestPendingConversations, } from '../../services/digest/processor.js';
2
+ import { launchDigestPendingWorker, runDigestPendingWorker } from '../../services/digest/background.js';
3
+ import { isDigestWorkerInvocation, runDigestFileInWorker } from '../../services/digest/worker.js';
4
+ import { DEFAULT_DIGEST_MAX_INPUT_CHARS, DEFAULT_DIGEST_MODEL_ID, DEFAULT_DIGEST_TIMEOUT_MS, DIGEST_WORKER_FLAG, DIGEST_WORKER_RESULT_PREFIX, } from '../../services/digest/constants.js';
5
+ import { loadProjectSettings, resolveConversationDigestConfig } from '../../core/config/index.js';
5
6
  import { parseArgs, stringFlag, numberFlag } from '../utils/args.js';
6
- import { getWorkspaceRoot } from '../utils/utils.js';
7
+ import { getWorkspaceRoot } from '../../utils/utils.js';
7
8
  function writeDigestFileResult(result, workerMode) {
8
9
  if (workerMode) {
9
10
  process.stdout.write(DIGEST_WORKER_RESULT_PREFIX + JSON.stringify(result) + '\n');
@@ -33,7 +34,7 @@ async function cmdDigestFile(args) {
33
34
  const modelId = stringFlag(parsed.flags, 'model') ?? digestConfig?.modelId ?? DEFAULT_DIGEST_MODEL_ID;
34
35
  const inputPath = stringFlag(parsed.flags, 'input');
35
36
  if (!inputPath) {
36
- process.stderr.write('Usage: agent-kit-cli memory digest-file --input <path> --model <id>\n');
37
+ process.stderr.write('Usage: cli memory digest-file --input <path> --model <id>\n');
37
38
  return 1;
38
39
  }
39
40
  const result = await digestConversationFile({
@@ -49,11 +50,23 @@ async function cmdDigestFile(args) {
49
50
  }
50
51
  async function cmdDigestPending(args) {
51
52
  const parsed = parseArgs(args);
52
- if (parsed.flags.get('hook') !== true) {
53
- process.stderr.write('Usage: agent-kit-cli memory digest-pending --hook\n');
54
- return 1;
53
+ const workspaceRoot = getWorkspaceRoot();
54
+ const isBackground = parsed.flags.get('background') === true;
55
+ if (isBackground && parsed.flags.get(DIGEST_WORKER_FLAG) === true) {
56
+ const result = await runDigestPendingWorker({ workspaceRoot });
57
+ process.stdout.write(JSON.stringify(result) + '\n');
58
+ return 0;
59
+ }
60
+ if (isBackground) {
61
+ const result = launchDigestPendingWorker({
62
+ workspaceRoot,
63
+ args,
64
+ entrypoint: process.argv[1],
65
+ });
66
+ process.stdout.write(JSON.stringify(result) + '\n');
67
+ return 0;
55
68
  }
56
- const result = await digestPendingConversations({ workspaceRoot: getWorkspaceRoot() });
69
+ const result = await digestPendingConversations({ workspaceRoot });
57
70
  process.stdout.write(JSON.stringify(result) + '\n');
58
71
  return 0;
59
72
  }
@@ -72,6 +85,6 @@ export async function runMemoryCli(args, _env) {
72
85
  process.stderr.write('[agent-kit] memory ' + (command ?? '') + ' failed: ' + message + '\n');
73
86
  return 1;
74
87
  }
75
- process.stderr.write('Usage: agent-kit-cli memory <digest-file|digest-init|digest-pending>\n');
88
+ process.stderr.write('Usage: cli memory <digest-file|digest-init|digest-pending>\n');
76
89
  return 1;
77
90
  }
package/dist/cli/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { runMemoryCli } from './memory.js';
1
+ import { runMemoryCli } from './commands/memory.js';
2
2
  export async function runAgentKitCli(argv, env) {
3
3
  const [command, ...rest] = argv;
4
4
  if (command === 'memory') {
5
5
  return runMemoryCli(rest, env);
6
6
  }
7
- process.stderr.write('Usage: agent-kit-cli memory <digest-file|digest-init|digest-pending>\n');
7
+ process.stderr.write('Usage: cli memory <digest-file|digest-init|digest-pending>\n');
8
8
  return 1;
9
9
  }
@@ -1,7 +1,8 @@
1
- export interface ParsedArgs {
1
+ interface ParsedArgs {
2
2
  flags: Map<string, string | boolean>;
3
3
  positionals: string[];
4
4
  }
5
5
  export declare function parseArgs(args: string[]): ParsedArgs;
6
6
  export declare function stringFlag(flags: Map<string, string | boolean>, key: string): string | undefined;
7
7
  export declare function numberFlag(flags: Map<string, string | boolean>, key: string, defaultValue: number | string): number;
8
+ export {};