neoctl 0.2.35 → 0.2.36

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 (71) hide show
  1. package/dist/agents/agent-tool-persistence.test.d.ts +1 -0
  2. package/dist/agents/agent-tool-persistence.test.js +313 -0
  3. package/dist/agents/agent-tool-persistence.test.js.map +1 -0
  4. package/dist/agents/agent-tool.js +137 -60
  5. package/dist/agents/agent-tool.js.map +1 -1
  6. package/dist/agents/local-agent-task.d.ts +41 -0
  7. package/dist/agents/local-agent-task.js +3 -0
  8. package/dist/agents/local-agent-task.js.map +1 -1
  9. package/dist/agents/no-nested-delegation.test.d.ts +1 -0
  10. package/dist/agents/no-nested-delegation.test.js +38 -0
  11. package/dist/agents/no-nested-delegation.test.js.map +1 -0
  12. package/dist/agents/smoke-agent-lifecycle.d.ts +1 -0
  13. package/dist/agents/smoke-agent-lifecycle.js +188 -0
  14. package/dist/agents/smoke-agent-lifecycle.js.map +1 -0
  15. package/dist/core/query-engine.js +1 -1
  16. package/dist/core/query-engine.js.map +1 -1
  17. package/dist/core/query.d.ts +3 -1
  18. package/dist/core/query.js +16 -3
  19. package/dist/core/query.js.map +1 -1
  20. package/dist/core/run-agent-pause.test.d.ts +1 -0
  21. package/dist/core/run-agent-pause.test.js +52 -0
  22. package/dist/core/run-agent-pause.test.js.map +1 -0
  23. package/dist/core/run-agent-persistence.test.d.ts +1 -0
  24. package/dist/core/run-agent-persistence.test.js +222 -0
  25. package/dist/core/run-agent-persistence.test.js.map +1 -0
  26. package/dist/core/run-agent.d.ts +11 -0
  27. package/dist/core/run-agent.js +56 -11
  28. package/dist/core/run-agent.js.map +1 -1
  29. package/dist/core/smoke-core-loop.js +8 -7
  30. package/dist/core/smoke-core-loop.js.map +1 -1
  31. package/dist/model/model-metadata.json +99 -99
  32. package/dist/repl/index.js +20 -26
  33. package/dist/repl/index.js.map +1 -1
  34. package/dist/session/session-store-safety.test.d.ts +1 -0
  35. package/dist/session/session-store-safety.test.js +107 -0
  36. package/dist/session/session-store-safety.test.js.map +1 -0
  37. package/dist/session/session-store.d.ts +1 -0
  38. package/dist/session/session-store.js +64 -5
  39. package/dist/session/session-store.js.map +1 -1
  40. package/dist/session/tool-result-memory.d.ts +3 -1
  41. package/dist/session/tool-result-memory.js.map +1 -1
  42. package/dist/tasks/subagent-tools.d.ts +4 -1
  43. package/dist/tasks/subagent-tools.js +85 -24
  44. package/dist/tasks/subagent-tools.js.map +1 -1
  45. package/dist/tasks/subagent-tools.test.d.ts +1 -0
  46. package/dist/tasks/subagent-tools.test.js +158 -0
  47. package/dist/tasks/subagent-tools.test.js.map +1 -0
  48. package/dist/tasks/task-ack-size.test.d.ts +1 -0
  49. package/dist/tasks/task-ack-size.test.js +100 -0
  50. package/dist/tasks/task-ack-size.test.js.map +1 -0
  51. package/dist/tasks/task-persistence.d.ts +22 -0
  52. package/dist/tasks/task-persistence.js +194 -0
  53. package/dist/tasks/task-persistence.js.map +1 -0
  54. package/dist/tasks/task-persistence.test.d.ts +1 -0
  55. package/dist/tasks/task-persistence.test.js +331 -0
  56. package/dist/tasks/task-persistence.test.js.map +1 -0
  57. package/dist/tasks/task-store.d.ts +45 -3
  58. package/dist/tasks/task-store.js +292 -16
  59. package/dist/tasks/task-store.js.map +1 -1
  60. package/dist/tools/tool.d.ts +5 -0
  61. package/dist/tools/tool.js.map +1 -1
  62. package/dist/web/index.d.ts +99 -6
  63. package/dist/web/index.js +93 -56
  64. package/dist/web/index.js.map +1 -1
  65. package/dist/web/smoke-task-session-entrypoints.d.ts +1 -0
  66. package/dist/web/smoke-task-session-entrypoints.js +75 -0
  67. package/dist/web/smoke-task-session-entrypoints.js.map +1 -0
  68. package/dist/web/smoke-web-agent-tasks.d.ts +1 -0
  69. package/dist/web/smoke-web-agent-tasks.js +50 -0
  70. package/dist/web/smoke-web-agent-tasks.js.map +1 -0
  71. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, mkdir, rm } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { TaskStore } from "../tasks/task-store.js";
6
+ import { createLocalAgentTask } from "../agents/local-agent-task.js";
7
+ import { ToolRegistry } from "../tools/registry.js";
8
+ import { WebRepl, activateSession, sessionAgentTasks, createResumeParentContext, createTaskNotificationSource } from "./index.js";
9
+ // No model, environment loading, real session discovery, or user-data access.
10
+ const root = await mkdtemp(path.join(os.tmpdir(), "neo-entrypoint-tasks-"));
11
+ try {
12
+ const a = path.join(root, "session-a");
13
+ const b = path.join(root, "session-b");
14
+ await Promise.all([mkdir(a), mkdir(b)]);
15
+ const fakeEngine = (sessionId, sessionDir) => ({
16
+ snapshot: () => ({ agentId: "parent", messages: 0, model: "fake-model", session: sessionDir === undefined ? undefined : { sessionId, sessionDir } }),
17
+ });
18
+ const runtime = { engine: fakeEngine("a", a), taskStore: new TaskStore() };
19
+ activateSession(runtime);
20
+ const task = createLocalAgentTask({ taskId: "task-a", agentId: "child-a", prompt: "fake", description: "fake", outputFile: path.join(a, "task-output.txt") });
21
+ runtime.taskStore.upsert(task);
22
+ runtime.taskStore.markRunning(task.taskId);
23
+ runtime.engine = fakeEngine("b", b);
24
+ activateSession(runtime);
25
+ assert.equal(runtime.taskStore.get(task.taskId)?.status, "running", "switch must not stop another session's background work");
26
+ assert.equal(sessionAgentTasks(runtime).length, 0);
27
+ runtime.taskStore.fail(task.taskId, "fake terminal result");
28
+ const source = createTaskNotificationSource(runtime.taskStore);
29
+ const collect = source.collectUnnotifiedCompletions;
30
+ assert.equal(collect(b).length, 0, "new foreground cannot steal old session completions");
31
+ assert.equal(collect(a)[0]?.taskId, task.taskId, "background parent can collect its own completion");
32
+ assert.equal(runtime.taskStore.get(task.taskId)?.notified, false);
33
+ runtime.taskStore = new TaskStore();
34
+ runtime.engine = fakeEngine("a", a);
35
+ activateSession(runtime);
36
+ assert.equal(sessionAgentTasks(runtime)[0]?.taskId, task.taskId, "restart restores session tasks");
37
+ const parent = createResumeParentContext(runtime.engine, new ToolRegistry(), root);
38
+ assert.deepEqual(parent.session, { sessionId: "a", sessionDir: a, rootDir: root });
39
+ assert.equal(parent.agentId, "parent");
40
+ assert.equal(parent.options?.mainLoopModel, "fake-model");
41
+ runtime.engine = fakeEngine("b", b);
42
+ activateSession(runtime);
43
+ assert.equal(sessionAgentTasks(runtime).length, 0);
44
+ assert.equal(createResumeParentContext(runtime.engine, new ToolRegistry(), root).session?.sessionDir, b);
45
+ runtime.engine = fakeEngine("disabled", "");
46
+ activateSession(runtime);
47
+ assert.equal(runtime.taskStore.activeSessionDir, undefined, "empty session directory does not persist");
48
+ assert.equal(createResumeParentContext(runtime.engine, new ToolRegistry()).session, undefined);
49
+ const legacy = { engine: fakeEngine("legacy", ""), taskStore: { list: () => [task] } };
50
+ activateSession(legacy);
51
+ assert.equal(sessionAgentTasks(legacy).length, 1, "legacy TaskStore mocks remain compatible");
52
+ // Exercise the public WebRepl session entrypoints without starting its UI/server.
53
+ const makeSwitchEngine = (id) => Object.assign(fakeEngine(id, path.join(root, id)), {
54
+ initialize: async () => undefined,
55
+ forkForSession: (next) => makeSwitchEngine(next ?? "fresh"),
56
+ });
57
+ runtime.engine = makeSwitchEngine("a");
58
+ const harness = Object.create(WebRepl.prototype);
59
+ Object.assign(harness, {
60
+ runtime, backgroundSessionRuns: new Map(),
61
+ detachRunningForeground: async () => false,
62
+ loadSessionPlugins: async () => undefined,
63
+ loadSessionTools: async () => undefined,
64
+ refreshSessionView: async () => undefined,
65
+ });
66
+ assert.equal((await harness.resumeSession("b")).ok, true);
67
+ assert.equal(runtime.taskStore.activeSessionDir, path.join(root, "b"));
68
+ assert.equal((await harness.newSession()).ok, true);
69
+ assert.equal(runtime.taskStore.activeSessionDir, path.join(root, "fresh"));
70
+ console.log("task session entrypoints smoke: passed");
71
+ }
72
+ finally {
73
+ await rm(root, { recursive: true, force: true });
74
+ }
75
+ //# sourceMappingURL=smoke-task-session-entrypoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-task-session-entrypoints.js","sourceRoot":"","sources":["../../src/web/smoke-task-session-entrypoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import assert from 'node:assert/strict';
2
+ import { createLocalAgentTask } from '../agents/local-agent-task.js';
3
+ import { WebRepl } from './index.js';
4
+ const task = createLocalAgentTask({ taskId: 'task_ui', agentId: 'agent_ui', description: 'UI regression', prompt: 'private prompt' });
5
+ task.status = 'running';
6
+ task.runGeneration = 2;
7
+ const result = { agent_id: task.agentId, agent_type: 'general', content: 'old report', total_duration_ms: 0, total_tool_use_count: 0, usage: { secret: 'private usage' } };
8
+ task.result = result;
9
+ task.runHistory = [{ runGeneration: 1, status: 'completed', result, progress: task.progress, archivedAt: new Date().toISOString() }];
10
+ const tasks = [task];
11
+ const runtime = {
12
+ taskStore: { list: () => tasks, subscribe: () => () => undefined, isTerminal: (value) => ['completed', 'failed', 'killed'].includes(value.status) },
13
+ execProcessManager: { list: () => [], subscribe: () => () => undefined, subscribeOutput: () => () => undefined },
14
+ engine: { getDisplayEntries: () => [], getHistoryMessages: () => [], snapshot: () => ({ messages: 0, session: { sessionId: 'ui-smoke' } }), isFastMode: () => false, getAppPrompt: () => ({ hasActivePrompt: false }), onSessionTitleChange: () => () => undefined },
15
+ initialMetrics: {},
16
+ };
17
+ const repl = new WebRepl(runtime);
18
+ const snapshot = () => repl.snapshot();
19
+ let view = snapshot();
20
+ assert.equal(view.backgroundTaskCount, 1);
21
+ assert.equal(view.backgroundTasks[0].runGeneration, 2);
22
+ assert.equal(view.backgroundTasks[0].result, undefined);
23
+ assert.equal(view.backgroundTasks[0].runHistory[0].result.content, 'old report');
24
+ assert.equal(JSON.stringify(view.backgroundTasks).includes('private prompt'), false);
25
+ assert.equal(JSON.stringify(view.backgroundTasks).includes('private usage'), false);
26
+ task.status = 'completed';
27
+ task.result = { ...result, content: 'current report' };
28
+ view = snapshot();
29
+ assert.equal(view.backgroundTaskCount, 0);
30
+ assert.equal(view.agentTaskHistory[0].result.content, 'current report');
31
+ task.result = { ...result, content: 'x'.repeat(10000) };
32
+ task.runGeneration = 6;
33
+ task.runHistory = Array.from({ length: 5 }, (_, i) => ({ runGeneration: i + 1, status: 'completed', result: task.result, progress: task.progress, archivedAt: task.updatedAt }));
34
+ task.messageReceipts = Array.from({ length: 128 }, (_, i) => ({ id: `receipt_${i}`, messageId: `message_${i}`, status: 'delivered', queuedAt: task.createdAt, deliveredAt: task.updatedAt, runGeneration: 6 }));
35
+ task.progress.lastActivity = '2026-01-01T00:00:00.000Z';
36
+ const compact = snapshot().agentTaskHistory[0];
37
+ assert.equal(compact.result.content.length, 1500);
38
+ assert.equal(compact.result.truncated, true);
39
+ assert.equal(compact.runHistory.length, 3);
40
+ assert.equal(compact.runHistory[0].result.content.length, 600);
41
+ assert.equal(compact.runHistory[0].result.truncated, true);
42
+ assert.equal(compact.messageReceipts.length, 20);
43
+ assert.equal(compact.deliveredRetainedThisRun, 128);
44
+ assert.equal(compact.progress.lastActivity, task.progress.lastActivity);
45
+ assert.ok(JSON.stringify(compact).length < 10000);
46
+ for (let i = 0; i < 25; i++)
47
+ tasks.push({ ...task, id: `task_${i}`, taskId: `task_${i}` });
48
+ assert.equal(snapshot().agentTaskHistory.length, 20);
49
+ console.log('web agent tasks smoke ok: active/history split, generation, stale result suppression, bounded projection, no prompt/usage');
50
+ //# sourceMappingURL=smoke-web-agent-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-web-agent-tasks.js","sourceRoot":"","sources":["../../src/web/smoke-web-agent-tasks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoctl",
3
- "version": "0.2.35",
3
+ "version": "0.2.36",
4
4
  "description": "TypeScript scaffold for a streaming agent runtime with a REPL UI layer.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -42,11 +42,11 @@
42
42
  "web": "node dist/web/index.js",
43
43
  "dev:web": "tsx src/web/index.ts",
44
44
  "smoke:core": "tsx src/core/smoke-core-loop.ts",
45
- "smoke:images": "tsx src/core/smoke-image-integrity.ts",
45
+ "smoke:images": "tsx src/core/smoke-image-integrity.ts",
46
46
  "smoke:tools": "tsx src/tools/smoke-tool-system.ts",
47
47
  "smoke:exec": "tsx src/tools/smoke-exec-process.ts",
48
48
  "smoke:context": "tsx src/context/smoke-context.ts",
49
- "smoke:plugins": "tsx src/plugins/smoke-plugin-system.ts",
49
+ "smoke:plugins": "tsx src/plugins/smoke-plugin-system.ts",
50
50
  "smoke:session": "tsx src/session/smoke-session.ts",
51
51
  "smoke:agents": "tsx src/agents/smoke-agents.ts",
52
52
  "smoke:skills": "tsx src/skills/smoke-skills.ts",
@@ -55,7 +55,7 @@
55
55
  "smoke:cli": "tsx src/repl/smoke-run-command.ts",
56
56
  "smoke:web-plan": "tsx src/web/smoke-plan-payload.ts",
57
57
  "smoke:web-context": "tsx src/web/smoke-runtime-context-protocol.ts",
58
- "smoke:web-history": "tsx src/web/smoke-web-history.ts",
58
+ "smoke:web-history": "tsx src/web/smoke-web-history.ts",
59
59
  "smoke:web-terminal-tasks": "tsx src/web/smoke-web-terminal-tasks.ts",
60
60
  "smoke:web-queue": "tsx src/web/smoke-web-queue.ts",
61
61
  "smoke:openai": "tsx src/model/smoke-openai.ts"