ptbk 0.119.0-17 → 0.119.0-21
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.
- package/README.md +27 -9
- package/dist/book/commitments.d.ts +38 -10
- package/dist/book/commitments.js +61 -17
- package/dist/book/commitments.js.map +1 -1
- package/dist/book/convert.d.ts +36 -0
- package/dist/book/convert.js +156 -0
- package/dist/book/convert.js.map +1 -0
- package/dist/book/parse.d.ts +50 -13
- package/dist/book/parse.js +132 -45
- package/dist/book/parse.js.map +1 -1
- package/dist/book/references.d.ts +12 -4
- package/dist/book/references.js +34 -9
- package/dist/book/references.js.map +1 -1
- package/dist/book/write.d.ts +42 -0
- package/dist/book/write.js +74 -0
- package/dist/book/write.js.map +1 -0
- package/dist/browser/browser.d.ts +122 -12
- package/dist/browser/browser.js +372 -21
- package/dist/browser/browser.js.map +1 -1
- package/dist/browser/recording.d.ts +3 -3
- package/dist/browser/recording.js +5 -5
- package/dist/browser/recording.js.map +1 -1
- package/dist/chats/chat-book.d.ts +105 -0
- package/dist/chats/chat-book.js +180 -0
- package/dist/chats/chat-book.js.map +1 -0
- package/dist/chats/conversation.d.ts +54 -0
- package/dist/chats/conversation.js +188 -0
- package/dist/chats/conversation.js.map +1 -0
- package/dist/chats/local.d.ts +46 -0
- package/dist/chats/local.js +184 -0
- package/dist/chats/local.js.map +1 -0
- package/dist/chats/migration.d.ts +12 -0
- package/dist/chats/migration.js +62 -0
- package/dist/chats/migration.js.map +1 -0
- package/dist/chats/service.d.ts +81 -0
- package/dist/chats/service.js +122 -0
- package/dist/chats/service.js.map +1 -0
- package/dist/chats/store.d.ts +132 -0
- package/dist/chats/store.js +181 -0
- package/dist/chats/store.js.map +1 -0
- package/dist/chats/task-chats.d.ts +52 -0
- package/dist/chats/task-chats.js +96 -0
- package/dist/chats/task-chats.js.map +1 -0
- package/dist/cli/chats.d.ts +45 -0
- package/dist/cli/chats.js +108 -0
- package/dist/cli/chats.js.map +1 -0
- package/dist/cli/commands/add.js +32 -22
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/answer.d.ts +2 -1
- package/dist/cli/commands/answer.js +35 -41
- package/dist/cli/commands/answer.js.map +1 -1
- package/dist/cli/commands/ask.d.ts +7 -0
- package/dist/cli/commands/ask.js +37 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/boilerplates.js +14 -3
- package/dist/cli/commands/boilerplates.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +9 -0
- package/dist/cli/commands/chat.js +89 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +3 -1
- package/dist/cli/commands/dashboard.js +41 -3
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/find.js +6 -8
- package/dist/cli/commands/find.js.map +1 -1
- package/dist/cli/commands/fix.js +4 -6
- package/dist/cli/commands/fix.js.map +1 -1
- package/dist/cli/commands/init.d.ts +0 -1
- package/dist/cli/commands/init.js +38 -38
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/lint.js +16 -2
- package/dist/cli/commands/lint.js.map +1 -1
- package/dist/cli/commands/list.js +21 -13
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts +2 -1
- package/dist/cli/commands/migrate.js +70 -24
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +8 -0
- package/dist/cli/commands/pause.js +40 -0
- package/dist/cli/commands/pause.js.map +1 -0
- package/dist/cli/commands/plan.js +6 -9
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/recover.js +7 -3
- package/dist/cli/commands/recover.js.map +1 -1
- package/dist/cli/commands/restart.d.ts +3 -1
- package/dist/cli/commands/restart.js +74 -18
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/resume.d.ts +8 -0
- package/dist/cli/commands/resume.js +15 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.js +6 -9
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/start.js +40 -36
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -1
- package/dist/cli/commands/status.js +5 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +3 -1
- package/dist/cli/commands/stop.js +18 -8
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/commands/verify.js +7 -7
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/common.d.ts +13 -0
- package/dist/cli/common.js +22 -0
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/engine-delegation.d.ts +14 -0
- package/dist/cli/engine-delegation.js +46 -0
- package/dist/cli/engine-delegation.js.map +1 -0
- package/dist/cli/lifecycle.d.ts +40 -0
- package/dist/cli/lifecycle.js +71 -0
- package/dist/cli/lifecycle.js.map +1 -0
- package/dist/cli/registry.js +113 -31
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/service-view.d.ts +14 -2
- package/dist/cli/service-view.js +46 -5
- package/dist/cli/service-view.js.map +1 -1
- package/dist/cli/sources.js +5 -8
- package/dist/cli/sources.js.map +1 -1
- package/dist/cli/spec.js +1 -1
- package/dist/cli/spec.js.map +1 -1
- package/dist/common/app-data.d.ts +9 -0
- package/dist/common/app-data.js +20 -0
- package/dist/common/app-data.js.map +1 -0
- package/dist/common/errors.d.ts +2 -0
- package/dist/common/errors.js.map +1 -1
- package/dist/common/time.d.ts +6 -0
- package/dist/common/time.js +9 -0
- package/dist/common/time.js.map +1 -1
- package/dist/engine/agenda.d.ts +213 -43
- package/dist/engine/agenda.js +846 -260
- package/dist/engine/agenda.js.map +1 -1
- package/dist/engine/executor.d.ts +23 -7
- package/dist/engine/executor.js +131 -84
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/generated.d.ts +21 -1
- package/dist/engine/generated.js +36 -21
- package/dist/engine/generated.js.map +1 -1
- package/dist/engine/preview.js +10 -10
- package/dist/engine/preview.js.map +1 -1
- package/dist/engine/prompt.d.ts +16 -4
- package/dist/engine/prompt.js +22 -4
- package/dist/engine/prompt.js.map +1 -1
- package/dist/engine/routing.js +28 -4
- package/dist/engine/routing.js.map +1 -1
- package/dist/engine/snapshot.d.ts +178 -29
- package/dist/engine/state.d.ts +40 -13
- package/dist/engine/state.js +20 -5
- package/dist/engine/state.js.map +1 -1
- package/dist/engine/task-trace.d.ts +35 -7
- package/dist/engine/task-trace.js +74 -15
- package/dist/engine/task-trace.js.map +1 -1
- package/dist/engine/team.d.ts +20 -7
- package/dist/engine/team.js +30 -24
- package/dist/engine/team.js.map +1 -1
- package/dist/engine/traces.d.ts +1 -1
- package/dist/engine/traces.js +1 -1
- package/dist/expert/_main.md +67 -52
- package/dist/expert/agents/_index.md +11 -13
- package/dist/expert/agents/chatter.md +31 -0
- package/dist/expert/agents/consistency.md +6 -11
- package/dist/expert/agents/core-agents.md +9 -7
- package/dist/expert/agents/expert.md +1 -1
- package/dist/expert/agents/fixer.md +24 -0
- package/dist/expert/agents/learning.md +1 -1
- package/dist/expert/agents/non-agents.md +2 -2
- package/dist/expert/agents/visual-identity.md +4 -4
- package/dist/expert/book-language/_index.md +9 -8
- package/dist/expert/book-language/commitments/_index.md +23 -3
- package/dist/expert/book-language/commitments/agent.md +11 -0
- package/dist/expert/book-language/commitments/chat-member.md +7 -0
- package/dist/expert/book-language/commitments/chat-message.md +11 -0
- package/dist/expert/book-language/commitments/chat-status.md +7 -0
- package/dist/expert/book-language/commitments/chat.md +11 -0
- package/dist/expert/book-language/commitments/entity.md +9 -0
- package/dist/expert/book-language/commitments/goal.md +6 -2
- package/dist/expert/book-language/commitments/link.md +9 -0
- package/dist/expert/book-language/commitments/task-depends-on.md +1 -1
- package/dist/expert/book-language/commitments/task-parent.md +1 -1
- package/dist/expert/book-language/commitments/task.md +7 -3
- package/dist/expert/book-language/commitments/team.md +1 -1
- package/dist/expert/book-language/references.md +20 -83
- package/dist/expert/book-language/syntax.md +54 -11
- package/dist/expert/cli/acceptance.md +59 -24
- package/dist/expert/cli/api.md +23 -9
- package/dist/expert/cli/authoring.md +6 -4
- package/dist/expert/cli/autonomous-operation.md +3 -3
- package/dist/expert/cli/browser.md +29 -18
- package/dist/expert/cli/channels.md +5 -7
- package/dist/expert/cli/chat-ui.md +32 -0
- package/dist/expert/cli/chats.md +59 -0
- package/dist/expert/cli/cli.md +44 -26
- package/dist/expert/cli/configuration.md +3 -3
- package/dist/expert/cli/controls.md +13 -7
- package/dist/expert/cli/dashboard-details.md +23 -0
- package/dist/expert/cli/dashboard-layout.md +19 -12
- package/dist/expert/cli/dashboard.md +12 -8
- package/dist/expert/cli/execution.md +8 -6
- package/dist/expert/cli/first-task.md +4 -4
- package/dist/expert/cli/generated-names.md +44 -0
- package/dist/expert/cli/git-persistence.md +19 -17
- package/dist/expert/cli/global-dashboard.md +33 -0
- package/dist/expert/cli/goal-discovery.md +1 -1
- package/dist/expert/cli/help.md +1 -1
- package/dist/expert/cli/initialization-ui.md +2 -0
- package/dist/expert/cli/initialization.md +9 -7
- package/dist/expert/cli/interactive-ui.md +9 -5
- package/dist/expert/cli/locking.md +21 -0
- package/dist/expert/cli/migration.md +22 -6
- package/dist/expert/cli/process-modes.md +21 -13
- package/dist/expert/cli/recovery.md +8 -6
- package/dist/expert/cli/recurrence.md +1 -1
- package/dist/expert/cli/rich-input.md +2 -2
- package/dist/expert/cli/service-lifecycle.md +57 -0
- package/dist/expert/cli/start.md +2 -2
- package/dist/expert/cli/status-view.md +16 -12
- package/dist/expert/cli/task-books.md +11 -15
- package/dist/expert/cli/task-identity.md +8 -10
- package/dist/expert/cli/task-markdown.md +6 -10
- package/dist/expert/cli/task-origins.md +3 -1
- package/dist/expert/cli/task-relationships.md +5 -9
- package/dist/expert/cli/team.md +17 -7
- package/dist/expert/cli/terminal.md +20 -12
- package/dist/expert/cli/trace-configuration.md +1 -1
- package/dist/expert/cli/traces.md +19 -23
- package/dist/expert/cli/user-interactions.md +14 -26
- package/dist/expert/cli/workspace.md +15 -9
- package/dist/expert/concepts/engine-and-project.md +11 -0
- package/dist/expert/concepts/project-model.md +39 -0
- package/dist/expert/dictionary.md +21 -15
- package/dist/harness/plugins/claude-code/index.js +1 -0
- package/dist/harness/plugins/claude-code/index.js.map +1 -1
- package/dist/harness/plugins/cline/index.js +1 -0
- package/dist/harness/plugins/cline/index.js.map +1 -1
- package/dist/harness/plugins/openai-codex/index.js +1 -0
- package/dist/harness/plugins/openai-codex/index.js.map +1 -1
- package/dist/harness/plugins/opencode/index.js +1 -0
- package/dist/harness/plugins/opencode/index.js.map +1 -1
- package/dist/harness/types.d.ts +3 -1
- package/dist/project/agents.d.ts +29 -81
- package/dist/project/agents.js +47 -266
- package/dist/project/agents.js.map +1 -1
- package/dist/project/books.d.ts +150 -0
- package/dist/project/books.js +253 -0
- package/dist/project/books.js.map +1 -0
- package/dist/project/config.js +2 -2
- package/dist/project/config.js.map +1 -1
- package/dist/project/defaults.d.ts +33 -5
- package/dist/project/defaults.js +67 -36
- package/dist/project/defaults.js.map +1 -1
- package/dist/project/expert.js +17 -9
- package/dist/project/expert.js.map +1 -1
- package/dist/project/git.d.ts +4 -3
- package/dist/project/git.js +16 -5
- package/dist/project/git.js.map +1 -1
- package/dist/project/setup.d.ts +4 -1
- package/dist/project/setup.js +26 -6
- package/dist/project/setup.js.map +1 -1
- package/dist/service/actions.d.ts +34 -10
- package/dist/service/actions.js +51 -19
- package/dist/service/actions.js.map +1 -1
- package/dist/service/control.d.ts +53 -1
- package/dist/service/control.js +64 -4
- package/dist/service/control.js.map +1 -1
- package/dist/service/discovery.d.ts +133 -0
- package/dist/service/discovery.js +138 -0
- package/dist/service/discovery.js.map +1 -0
- package/dist/service/host.d.ts +8 -1
- package/dist/service/host.js +65 -18
- package/dist/service/host.js.map +1 -1
- package/dist/service/http.d.ts +3 -0
- package/dist/service/http.js +26 -6
- package/dist/service/http.js.map +1 -1
- package/dist/service/launcher.d.ts +66 -13
- package/dist/service/launcher.js +78 -18
- package/dist/service/launcher.js.map +1 -1
- package/dist/service/records.d.ts +12 -2
- package/dist/service/records.js +19 -5
- package/dist/service/records.js.map +1 -1
- package/dist/service/spa/app.css +83 -2
- package/dist/service/spa/app.js +393 -72
- package/dist/service/supervisor.js +7 -1
- package/dist/service/supervisor.js.map +1 -1
- package/dist/service/worker.js +14 -5
- package/dist/service/worker.js.map +1 -1
- package/dist/tasks/authoring.d.ts +3 -5
- package/dist/tasks/authoring.js +6 -7
- package/dist/tasks/authoring.js.map +1 -1
- package/dist/tasks/book-task.d.ts +18 -10
- package/dist/tasks/book-task.js +27 -23
- package/dist/tasks/book-task.js.map +1 -1
- package/dist/tasks/eligibility.d.ts +15 -7
- package/dist/tasks/eligibility.js +41 -14
- package/dist/tasks/eligibility.js.map +1 -1
- package/dist/tasks/identity.d.ts +41 -15
- package/dist/tasks/identity.js +100 -31
- package/dist/tasks/identity.js.map +1 -1
- package/dist/tasks/markdown.d.ts +7 -14
- package/dist/tasks/markdown.js +15 -29
- package/dist/tasks/markdown.js.map +1 -1
- package/dist/tasks/model.d.ts +20 -4
- package/dist/tasks/model.js +17 -0
- package/dist/tasks/model.js.map +1 -1
- package/dist/tasks/sources.d.ts +7 -2
- package/dist/tasks/sources.js +46 -35
- package/dist/tasks/sources.js.map +1 -1
- package/dist/ui/chat-client.d.ts +70 -0
- package/dist/ui/chat-client.js +209 -0
- package/dist/ui/chat-client.js.map +1 -0
- package/dist/ui/dashboard.d.ts +8 -5
- package/dist/ui/dashboard.js +227 -86
- package/dist/ui/dashboard.js.map +1 -1
- package/dist/ui/details.d.ts +64 -0
- package/dist/ui/details.js +175 -0
- package/dist/ui/details.js.map +1 -0
- package/dist/ui/global-dashboard.d.ts +59 -0
- package/dist/ui/global-dashboard.js +307 -0
- package/dist/ui/global-dashboard.js.map +1 -0
- package/dist/ui/status-view.d.ts +7 -0
- package/dist/ui/status-view.js +94 -36
- package/dist/ui/status-view.js.map +1 -1
- package/package.json +1 -1
- package/dist/engine/requests.d.ts +0 -111
- package/dist/engine/requests.js +0 -173
- package/dist/engine/requests.js.map +0 -1
- package/dist/expert/book-language/commitments/task-id.md +0 -9
- package/dist/tasks/prepare.d.ts +0 -33
- package/dist/tasks/prepare.js +0 -90
- package/dist/tasks/prepare.js.map +0 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { PtbkError, errorMessage } from '../common/errors.js';
|
|
4
|
+
import { ensureDirectory, readTextIfExists } from '../common/fs.js';
|
|
5
|
+
import { shortId } from '../common/ids.js';
|
|
6
|
+
import { formatAgentReference, parseReferenceValue } from '../book/references.js';
|
|
7
|
+
import { resolveEffectiveAgent } from '../project/agents.js';
|
|
8
|
+
import { setting } from '../project/config.js';
|
|
9
|
+
import { EXPERT_DOCUMENTATION_DIRECTORY } from '../project/expert.js';
|
|
10
|
+
import { runHarness } from '../harness/run.js';
|
|
11
|
+
import { ToolBridge } from '../engine/bridge.js';
|
|
12
|
+
import { renderAgentInstructions } from '../engine/prompt.js';
|
|
13
|
+
import { teamTools } from '../engine/team.js';
|
|
14
|
+
import { chatAgent, isHumanFacing } from './chat-book.js';
|
|
15
|
+
import { conversationChats } from './task-chats.js';
|
|
16
|
+
/**
|
|
17
|
+
* Time limit of one chat reply.
|
|
18
|
+
*/
|
|
19
|
+
const REPLY_TIMEOUT_MS = 10 * 60_000;
|
|
20
|
+
/**
|
|
21
|
+
* Most transcript characters given to the agent (older messages are summarized by omission, visibly).
|
|
22
|
+
*/
|
|
23
|
+
const MAX_TRANSCRIPT_CHARACTERS = 60_000;
|
|
24
|
+
/**
|
|
25
|
+
* Marker of a learning note at the end of an agent's chat reply.
|
|
26
|
+
*/
|
|
27
|
+
const LEARN_MARKER = /^PTBK_LEARN\s+(.+)$/m;
|
|
28
|
+
/**
|
|
29
|
+
* Lets the chat's agent answer the user's latest message (read-only; tasks only through `create_task`).
|
|
30
|
+
*
|
|
31
|
+
* Opening or reading a chat never runs this; only a new user message in a human-led chat does.
|
|
32
|
+
*
|
|
33
|
+
* @private chats
|
|
34
|
+
*/
|
|
35
|
+
export async function replyInChat(context, chatName) {
|
|
36
|
+
const stored = await context.chats.find(chatName);
|
|
37
|
+
if (!stored)
|
|
38
|
+
throw new PtbkError(`No chat named "${chatName}".`, { kind: 'not-found' });
|
|
39
|
+
const { chat } = stored;
|
|
40
|
+
if (!isHumanFacing(chat))
|
|
41
|
+
throw new PtbkError('Agent↔agent consultation chats are task records, not conversations with the user.', { kind: 'usage' });
|
|
42
|
+
const agentReference = chatAgent(chat);
|
|
43
|
+
if (!agentReference)
|
|
44
|
+
throw new PtbkError(`The chat "${chat.name}" has no single agent participant.`, { kind: 'configuration' });
|
|
45
|
+
const last = chat.messages[chat.messages.length - 1];
|
|
46
|
+
if (!last || last.senderKey !== 'user')
|
|
47
|
+
return { createdTasks: [] };
|
|
48
|
+
const agent = await resolveEffectiveAgent(context.catalog, agentReference);
|
|
49
|
+
const errors = agent.diagnostics.filter((diagnostic) => diagnostic.severity === 'error');
|
|
50
|
+
if (errors.length)
|
|
51
|
+
return { createdTasks: [], error: `${agentReference} cannot reply: ${errors.map((diagnostic) => diagnostic.message).join(' ')}` };
|
|
52
|
+
const preferred = setting(context.settings, 'routing.harness');
|
|
53
|
+
const harnessId = [preferred, ...context.pool.usable()].find((id) => Boolean(id) && Boolean(context.pool.plugin(id)?.capabilities.readOnly) && Boolean(context.pool.inspection(id)?.usable));
|
|
54
|
+
if (!harnessId)
|
|
55
|
+
return { createdTasks: [], error: 'No usable harness supports read-only chat replies.' };
|
|
56
|
+
const plugin = context.pool.plugin(harnessId);
|
|
57
|
+
const inspection = context.pool.inspection(harnessId);
|
|
58
|
+
const contextFile = setting(context.settings, 'paths.context');
|
|
59
|
+
const projectInstructions = contextFile ? await readTextIfExists(join(context.project.root, contextFile)) : undefined;
|
|
60
|
+
let transcript = chat.messages.map((message) => `**${message.sender}** (${message.at}):\n${message.text}${message.choices?.length ? `\n(offered choices: ${message.choices.join(' | ')})` : ''}`).join('\n\n');
|
|
61
|
+
if (transcript.length > MAX_TRANSCRIPT_CHARACTERS)
|
|
62
|
+
transcript = `[… earlier messages omitted; read ${stored.relativePath} for the full chat]\n\n${transcript.slice(-MAX_TRANSCRIPT_CHARACTERS)}`;
|
|
63
|
+
const created = [];
|
|
64
|
+
const tools = plugin.capabilities.mcp
|
|
65
|
+
? [
|
|
66
|
+
{
|
|
67
|
+
name: 'create_task',
|
|
68
|
+
description: 'Create an ordinary task for the agenda (saved and committed; executed later with checks). Only for work the user asked for or clearly agreed to.',
|
|
69
|
+
inputSchema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: {
|
|
72
|
+
title: { type: 'string', description: 'Readable, distinct task name' },
|
|
73
|
+
description: { type: 'string', description: 'Intended result and constraints' },
|
|
74
|
+
agent: { type: 'string', description: 'Optional responsible agent, e.g. @Developer' },
|
|
75
|
+
priority: { type: 'number' },
|
|
76
|
+
},
|
|
77
|
+
required: ['title', 'description'],
|
|
78
|
+
},
|
|
79
|
+
handler: async (input) => {
|
|
80
|
+
try {
|
|
81
|
+
const name = await context.createTask({
|
|
82
|
+
title: String(input.title ?? '').trim(),
|
|
83
|
+
description: String(input.description ?? '').trim(),
|
|
84
|
+
agent: typeof input.agent === 'string' && input.agent.trim() ? input.agent.trim() : undefined,
|
|
85
|
+
priority: typeof input.priority === 'number' && input.priority >= 0 ? input.priority : undefined,
|
|
86
|
+
chat: chat.name,
|
|
87
|
+
});
|
|
88
|
+
created.push(name);
|
|
89
|
+
return { text: `Created the task {{${name}}} (linked to this chat). The agenda will execute it.` };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return { text: `The task was not created: ${errorMessage(error)}`, isError: true };
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
]
|
|
97
|
+
: [];
|
|
98
|
+
// Conversation-scoped TEAM consultation: bounded read-only advice, recorded as linked two-agent chats with their own
|
|
99
|
+
// scoped commits; the chat's agent stays the user's speaker and specialists never join the human chat.
|
|
100
|
+
const consultations = [];
|
|
101
|
+
if (plugin.capabilities.mcp && agent.team.length) {
|
|
102
|
+
const recorder = conversationChats(context.chats, chat.name, { takenNames: () => context.catalog.index.names() });
|
|
103
|
+
const controller = new AbortController();
|
|
104
|
+
context.signal?.addEventListener('abort', () => controller.abort(), { once: true });
|
|
105
|
+
tools.push(...teamTools({
|
|
106
|
+
project: context.project,
|
|
107
|
+
catalog: context.catalog,
|
|
108
|
+
pool: context.pool,
|
|
109
|
+
settings: context.settings,
|
|
110
|
+
chats: {
|
|
111
|
+
askUser: recorder.askUser,
|
|
112
|
+
recordConsultation: async (input) => {
|
|
113
|
+
const name = await recorder.recordConsultation(input);
|
|
114
|
+
if (name)
|
|
115
|
+
consultations.push(name);
|
|
116
|
+
return name;
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
task: { ref: `{{${chat.name}}}`, title: chat.name },
|
|
120
|
+
scope: 'conversation',
|
|
121
|
+
agentName: agent.name,
|
|
122
|
+
harness: harnessId,
|
|
123
|
+
depth: 0,
|
|
124
|
+
budget: { calls: 0 },
|
|
125
|
+
questionsAllowed: false,
|
|
126
|
+
signal: controller.signal,
|
|
127
|
+
onUserChat: () => undefined,
|
|
128
|
+
onActivity: (text) => context.onActivity?.(`${agent.name} in {{${chat.name}}}: ${text}`),
|
|
129
|
+
}, { includeUser: false }));
|
|
130
|
+
}
|
|
131
|
+
const prompt = [
|
|
132
|
+
`# Conversation\n\nYou are **${agent.name}**, talking with the user (the project owner) in the persistent chat {{${chat.name}}} of the project at \`${context.project.root}\`.`,
|
|
133
|
+
`## Your role\n\n${renderAgentInstructions(agent) || '_No additional instructions._'}`,
|
|
134
|
+
projectInstructions ? `## Project instructions (${contextFile})\n\n${projectInstructions.slice(0, 16_000)}` : '',
|
|
135
|
+
chat.links.length ? `## Linked Books\n\n${chat.links.join(', ')}` : '',
|
|
136
|
+
`## Conversation so far\n\n${transcript}`,
|
|
137
|
+
[
|
|
138
|
+
'## How to answer',
|
|
139
|
+
'',
|
|
140
|
+
'- Reply to the user\'s latest message directly and helpfully; you may inspect project files and Git history to answer.',
|
|
141
|
+
'- This conversation is read-only: never modify files or run write operations.',
|
|
142
|
+
tools.some((tool) => tool.name === 'create_task') ? '- To start work the user asked for or agreed to, call the `create_task` tool; the agenda executes it later with checks and commits. Do not claim work is done when you only created a task.' : '- You cannot create tasks here; describe what `ptbk add` should contain instead.',
|
|
143
|
+
...(tools.some((tool) => tool.name === 'consult')
|
|
144
|
+
? ['- For a specialist question, call the `consult` tool with a teammate from your TEAM (or @Expert for Promptbook itself) and tell the user whose advice you relay. Advice is not executed work: specialist work goes through `create_task`.']
|
|
145
|
+
: []),
|
|
146
|
+
'- If the user corrected you or stated a lasting, project-specific preference relevant to your role, add a final line `PTBK_LEARN <one sentence>` (it is removed from your reply).',
|
|
147
|
+
].join('\n'),
|
|
148
|
+
]
|
|
149
|
+
.filter(Boolean)
|
|
150
|
+
.join('\n\n');
|
|
151
|
+
const bridge = tools.length ? await ToolBridge.start(tools) : undefined;
|
|
152
|
+
const directory = await ensureDirectory(context.project.runtime.temporary);
|
|
153
|
+
const promptFile = join(directory, `chat-${shortId()}.md`);
|
|
154
|
+
await writeFile(promptFile, prompt);
|
|
155
|
+
context.onActivity?.(`${agent.name} is replying in {{${chat.name}}}`);
|
|
156
|
+
let result;
|
|
157
|
+
try {
|
|
158
|
+
result = await runHarness(plugin, {
|
|
159
|
+
projectRoot: context.project.root,
|
|
160
|
+
cwd: context.project.root,
|
|
161
|
+
prompt,
|
|
162
|
+
promptFile,
|
|
163
|
+
readOnly: true,
|
|
164
|
+
mcp: bridge?.launch(),
|
|
165
|
+
env: context.env,
|
|
166
|
+
timeoutMs: REPLY_TIMEOUT_MS,
|
|
167
|
+
signal: context.signal,
|
|
168
|
+
allowCredits: setting(context.settings, 'execution.allowCredits'),
|
|
169
|
+
authentication: inspection.authentication,
|
|
170
|
+
readableDirectories: agent.name === 'Expert' || agent.chain.includes('Expert') ? [EXPERT_DOCUMENTATION_DIRECTORY] : [],
|
|
171
|
+
model: context.settings.harnesses[harnessId]?.model,
|
|
172
|
+
}, inspection.executablePath ?? plugin.executable);
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
await bridge?.close();
|
|
176
|
+
await rm(promptFile, { force: true });
|
|
177
|
+
}
|
|
178
|
+
if (result.outcome !== 'completed' || !result.finalMessage.trim())
|
|
179
|
+
return { createdTasks: created, error: result.outcome === 'completed' ? `${agent.name} gave no reply.` : result.diagnostic };
|
|
180
|
+
const learning = LEARN_MARKER.exec(result.finalMessage)?.[1]?.trim();
|
|
181
|
+
const text = result.finalMessage.replace(LEARN_MARKER, '').replace(/^PTBK_RESULT .*$/m, '').trim();
|
|
182
|
+
const reply = await context.chats.append(chat.name, { sender: formatAgentReference(agent.name), text: text || '(no reply text)' }, { trailers: created.length ? { 'Task-Name': created } : undefined });
|
|
183
|
+
if (learning && agent.learning.open && agent.definition && parseReferenceValue(agentReference)?.normalized !== 'teacher' && setting(context.settings, 'learning.enabled')) {
|
|
184
|
+
await context.scheduleLearning?.({ chat: chat.name, agent: agent.name, note: learning }).catch(() => undefined);
|
|
185
|
+
}
|
|
186
|
+
return { reply, createdTasks: created, learning, consultations };
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/chats/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAqB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,OAAO,EAA0B,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAmB,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;GAEG;AACH,MAAM,gBAAgB,GAAG,EAAE,GAAG,MAAM,CAAC;AAErC;;GAEG;AACH,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC;;GAEG;AACH,MAAM,YAAY,GAAG,sBAAsB,CAAC;AA6B5C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B,EAAE,QAAgB;IAC5E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,kBAAkB,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACxF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mFAAmF,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACtJ,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,SAAS,CAAC,aAAa,IAAI,CAAC,IAAI,oCAAoC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IAChI,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;QAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACpE,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACzF,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,cAAc,kBAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACrJ,MAAM,SAAS,GAAG,OAAO,CAAqB,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAG,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7M,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IACzG,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAE,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAgB,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC9E,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtH,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/M,IAAI,UAAU,CAAC,MAAM,GAAG,yBAAyB;QAAE,UAAU,GAAG,qCAAqC,MAAM,CAAC,YAAY,0BAA0B,UAAU,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACjM,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAiB,MAAM,CAAC,YAAY,CAAC,GAAG;QAC/C,CAAC,CAAC;YACI;gBACI,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,kJAAkJ;gBAC/J,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;wBACtE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;wBAC/E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;wBACrF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC/B;oBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;iBACrC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACrB,IAAI,CAAC;wBACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;4BAClC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;4BACvC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;4BACnD,KAAK,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;4BAC7F,QAAQ,EAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;4BAChG,IAAI,EAAE,IAAI,CAAC,IAAI;yBAClB,CAAC,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACnB,OAAO,EAAE,IAAI,EAAE,sBAAsB,IAAI,uDAAuD,EAAE,CAAC;oBACvG,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,OAAO,EAAE,IAAI,EAAE,6BAA6B,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACvF,CAAC;gBACL,CAAC;aACJ;SACJ;QACH,CAAC,CAAC,EAAE,CAAC;IACT,qHAAqH;IACrH,uGAAuG;IACvG,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,KAAK,CAAC,IAAI,CACN,GAAG,SAAS,CACR;YACI,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE;gBACH,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAChC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBACtD,IAAI,IAAI;wBAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnC,OAAO,IAAI,CAAC;gBAChB,CAAC;aACJ;YACD,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE;YACnD,KAAK,EAAE,cAAc;YACrB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;YACpB,gBAAgB,EAAE,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;YAC3B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC;SAC3F,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,CACzB,CACJ,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAG;QACX,+BAA+B,KAAK,CAAC,IAAI,0EAA0E,IAAI,CAAC,IAAI,0BAA0B,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK;QAC/K,mBAAmB,uBAAuB,CAAC,KAAK,CAAC,IAAI,+BAA+B,EAAE;QACtF,mBAAmB,CAAC,CAAC,CAAC,4BAA4B,WAAW,QAAQ,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAChH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACtE,6BAA6B,UAAU,EAAE;QACzC;YACI,kBAAkB;YAClB,EAAE;YACF,wHAAwH;YACxH,+EAA+E;YAC/E,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,6LAA6L,CAAC,CAAC,CAAC,kFAAkF;YACtU,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;gBAC7C,CAAC,CAAC,CAAC,2OAA2O,CAAC;gBAC/O,CAAC,CAAC,EAAE,CAAC;YACT,mLAAmL;SACtL,CAAC,IAAI,CAAC,IAAI,CAAC;KACf;SACI,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,qBAAqB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,UAAU,CACrB,MAAM,EACN;YACI,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;YACjC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;YACzB,MAAM;YACN,UAAU;YACV,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;YACrB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAU,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC;YAC1E,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,mBAAmB,EAAE,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,EAAE;YACtH,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK;SACtD,EACD,UAAU,CAAC,cAAc,IAAI,MAAM,CAAC,UAAU,CACjD,CAAC;IACN,CAAC;YAAS,CAAC;QACP,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAChM,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,iBAAiB,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACxM,IAAI,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,mBAAmB,CAAC,cAAc,CAAC,EAAE,UAAU,KAAK,SAAS,IAAI,OAAO,CAAU,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACjL,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type EffectiveSettings } from '../project/config.js';
|
|
2
|
+
import type { Project } from '../project/workspace.js';
|
|
3
|
+
import type { ChatSource } from '../ui/chat-client.js';
|
|
4
|
+
import { ChatStore } from './store.js';
|
|
5
|
+
/**
|
|
6
|
+
* Chats of a project whose service is not running: every write takes the project lock briefly and is committed as
|
|
7
|
+
* its own scoped operation; agent replies run in this process through the same read-only conversation turn.
|
|
8
|
+
*
|
|
9
|
+
* @private chats
|
|
10
|
+
*/
|
|
11
|
+
export declare class LocalChats {
|
|
12
|
+
private readonly project;
|
|
13
|
+
private readonly settings;
|
|
14
|
+
private readonly env;
|
|
15
|
+
private readonly repositoryRoot;
|
|
16
|
+
private catalog;
|
|
17
|
+
readonly store: ChatStore;
|
|
18
|
+
private readonly state;
|
|
19
|
+
private pool?;
|
|
20
|
+
private inFlight;
|
|
21
|
+
private constructor();
|
|
22
|
+
/**
|
|
23
|
+
* Opens the chats of a project (Git is required for committed chats unless commits are disabled).
|
|
24
|
+
*/
|
|
25
|
+
static open(project: Project, settings: EffectiveSettings, env: NodeJS.ProcessEnv): Promise<LocalChats>;
|
|
26
|
+
/** Commits chat or authoring paths. */
|
|
27
|
+
private commit;
|
|
28
|
+
/** Runs one write under the project lock (a service cannot start in the middle of it). */
|
|
29
|
+
private locked;
|
|
30
|
+
/** Reloads the agent catalog (new Books written meanwhile). */
|
|
31
|
+
private reload;
|
|
32
|
+
/**
|
|
33
|
+
* Lets the chat's agent reply in this process (read-only; tasks only through ordinary committed authoring).
|
|
34
|
+
*/
|
|
35
|
+
reply(name: string, onActivity?: (text: string) => void): Promise<string | undefined>;
|
|
36
|
+
/** Agent replies still being produced in this process. */
|
|
37
|
+
get pendingReplies(): number;
|
|
38
|
+
/**
|
|
39
|
+
* A chat source for terminal clients; agent replies run here after each user message that needs one.
|
|
40
|
+
*/
|
|
41
|
+
source(options: {
|
|
42
|
+
readonly replies: boolean;
|
|
43
|
+
readonly onActivity?: (text: string) => void;
|
|
44
|
+
readonly onReplyError?: (error: string) => void;
|
|
45
|
+
}): ChatSource;
|
|
46
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { PtbkError } from '../common/errors.js';
|
|
3
|
+
import { hashFileIfExists, toProjectRelative } from '../common/fs.js';
|
|
4
|
+
import { shortId } from '../common/ids.js';
|
|
5
|
+
import { formatAgentReference } from '../book/references.js';
|
|
6
|
+
import { AgentCatalog, learningPolicyOf } from '../project/agents.js';
|
|
7
|
+
import { setting } from '../project/config.js';
|
|
8
|
+
import { commitPaths, inspectGit } from '../project/git.js';
|
|
9
|
+
import { createChatLearningTask } from '../engine/generated.js';
|
|
10
|
+
import { HarnessPool } from '../engine/harnesses.js';
|
|
11
|
+
import { StateStore } from '../engine/state.js';
|
|
12
|
+
import { acquireProjectLock } from '../service/records.js';
|
|
13
|
+
import { newTaskPath, renderTaskBook } from '../tasks/authoring.js';
|
|
14
|
+
import { generatedName } from '../tasks/identity.js';
|
|
15
|
+
import { replyInChat } from './conversation.js';
|
|
16
|
+
import { appendUserMessage, chatAgentChoices, chatDetail, createUserChat } from './service.js';
|
|
17
|
+
import { ChatStore } from './store.js';
|
|
18
|
+
/**
|
|
19
|
+
* Chats of a project whose service is not running: every write takes the project lock briefly and is committed as
|
|
20
|
+
* its own scoped operation; agent replies run in this process through the same read-only conversation turn.
|
|
21
|
+
*
|
|
22
|
+
* @private chats
|
|
23
|
+
*/
|
|
24
|
+
export class LocalChats {
|
|
25
|
+
project;
|
|
26
|
+
settings;
|
|
27
|
+
env;
|
|
28
|
+
repositoryRoot;
|
|
29
|
+
catalog;
|
|
30
|
+
store;
|
|
31
|
+
state;
|
|
32
|
+
pool;
|
|
33
|
+
inFlight = 0;
|
|
34
|
+
constructor(project, settings, env, repositoryRoot, catalog) {
|
|
35
|
+
this.project = project;
|
|
36
|
+
this.settings = settings;
|
|
37
|
+
this.env = env;
|
|
38
|
+
this.repositoryRoot = repositoryRoot;
|
|
39
|
+
this.catalog = catalog;
|
|
40
|
+
const commit = setting(settings, 'execution.commit') && Boolean(repositoryRoot);
|
|
41
|
+
this.state = new StateStore(project.runtime.state);
|
|
42
|
+
this.store = new ChatStore(project, {
|
|
43
|
+
timeZone: setting(settings, 'timezone'),
|
|
44
|
+
persistence: commit
|
|
45
|
+
? { commit: async (paths, subject, trailers) => await this.commit(paths, subject, trailers) }
|
|
46
|
+
: { uncommitted: async (path) => await this.state.addOwnedUncommitted({ [toProjectRelative(project.root, path)]: (await hashFileIfExists(path)) ?? null }) },
|
|
47
|
+
takenNames: async () => {
|
|
48
|
+
await this.reload();
|
|
49
|
+
return this.catalog.index.names();
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Opens the chats of a project (Git is required for committed chats unless commits are disabled).
|
|
55
|
+
*/
|
|
56
|
+
static async open(project, settings, env) {
|
|
57
|
+
const git = await inspectGit(project.root);
|
|
58
|
+
if (setting(settings, 'execution.commit') && git.state !== 'repository') {
|
|
59
|
+
throw new PtbkError('The project is not in a Git working tree, so chat messages cannot be committed.', { kind: 'setup', next: ['Run `ptbk init`, or use --no-commit.'] });
|
|
60
|
+
}
|
|
61
|
+
const catalog = await AgentCatalog.load(project.root, setting(settings, 'paths.agents'), setting(settings, 'paths.tasks'));
|
|
62
|
+
return new LocalChats(project, settings, env, git.state === 'repository' ? git.root : undefined, catalog);
|
|
63
|
+
}
|
|
64
|
+
/** Commits chat or authoring paths. */
|
|
65
|
+
async commit(paths, subject, trailers) {
|
|
66
|
+
const outcome = await commitPaths({ projectRoot: this.project.root, repositoryRoot: this.repositoryRoot, paths, subject, trailers, temporaryDirectory: this.project.runtime.temporary, env: this.env });
|
|
67
|
+
return outcome.committed ? outcome.sha : undefined;
|
|
68
|
+
}
|
|
69
|
+
/** Runs one write under the project lock (a service cannot start in the middle of it). */
|
|
70
|
+
async locked(operation) {
|
|
71
|
+
const release = await acquireProjectLock(this.project, `chat-${shortId()}`, 'authoring');
|
|
72
|
+
try {
|
|
73
|
+
return await operation();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await release();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Reloads the agent catalog (new Books written meanwhile). */
|
|
80
|
+
async reload() {
|
|
81
|
+
this.catalog = await AgentCatalog.load(this.project.root, setting(this.settings, 'paths.agents'), setting(this.settings, 'paths.tasks'));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Lets the chat's agent reply in this process (read-only; tasks only through ordinary committed authoring).
|
|
85
|
+
*/
|
|
86
|
+
async reply(name, onActivity) {
|
|
87
|
+
await this.reload();
|
|
88
|
+
if (!this.pool) {
|
|
89
|
+
this.pool = new HarnessPool(this.project.root, this.settings, this.env);
|
|
90
|
+
await this.pool.refresh(this.pool.enabled(), true);
|
|
91
|
+
}
|
|
92
|
+
const turn = await replyInChat({
|
|
93
|
+
project: this.project,
|
|
94
|
+
settings: this.settings,
|
|
95
|
+
catalog: this.catalog,
|
|
96
|
+
pool: this.pool,
|
|
97
|
+
chats: this.store,
|
|
98
|
+
env: this.env,
|
|
99
|
+
onActivity,
|
|
100
|
+
createTask: async (input) => await this.locked(async () => {
|
|
101
|
+
await this.reload();
|
|
102
|
+
const title = generatedName(input.title, { taken: this.catalog.index.names(), timeZone: setting(this.settings, 'timezone') });
|
|
103
|
+
const commitments = [];
|
|
104
|
+
if (input.agent)
|
|
105
|
+
commitments.push(`TASK AGENT ${input.agent.startsWith('@') || input.agent.startsWith('{') ? input.agent : formatAgentReference(input.agent)}`);
|
|
106
|
+
if (input.priority !== undefined)
|
|
107
|
+
commitments.push(`TASK PRIORITY ${input.priority}`);
|
|
108
|
+
commitments.push(`TASK ORIGIN chat {{${input.chat}}}`, `LINK {{${input.chat}}}`);
|
|
109
|
+
const path = await newTaskPath(this.catalog.index.rootPath('tasks'), input.title, Date.now(), setting(this.settings, 'timezone'));
|
|
110
|
+
await writeFile(path, renderTaskBook({ title, description: input.description || undefined, commitments }), { flag: 'wx' });
|
|
111
|
+
if (this.repositoryRoot && setting(this.settings, 'execution.commit'))
|
|
112
|
+
await this.commit([path], `Add task - ${title}`, { 'Task-Name': title, 'Chat-Name': input.chat });
|
|
113
|
+
else
|
|
114
|
+
await this.state.addOwnedUncommitted({ [toProjectRelative(this.project.root, path)]: (await hashFileIfExists(path)) ?? null });
|
|
115
|
+
return title;
|
|
116
|
+
}),
|
|
117
|
+
scheduleLearning: async (input) => await this.locked(async () => {
|
|
118
|
+
await this.reload();
|
|
119
|
+
const learner = await this.catalog.resolve(formatAgentReference(input.agent));
|
|
120
|
+
if (learner.kind !== 'agent' || !learningPolicyOf(learner.definition.document).open)
|
|
121
|
+
return undefined;
|
|
122
|
+
const created = await createChatLearningTask({
|
|
123
|
+
tasksDirectory: this.catalog.index.rootPath('tasks'),
|
|
124
|
+
chat: input.chat,
|
|
125
|
+
agent: learner.definition.name,
|
|
126
|
+
agentPath: learner.definition.relativePath,
|
|
127
|
+
note: input.note,
|
|
128
|
+
timeZone: setting(this.settings, 'timezone'),
|
|
129
|
+
taken: this.catalog.index.names(),
|
|
130
|
+
});
|
|
131
|
+
if (this.repositoryRoot && setting(this.settings, 'execution.commit'))
|
|
132
|
+
await this.commit([created.path], `Add task - ${created.name}`, { 'Task-Name': created.name, 'Chat-Name': input.chat });
|
|
133
|
+
else
|
|
134
|
+
await this.state.addOwnedUncommitted({ [toProjectRelative(this.project.root, created.path)]: (await hashFileIfExists(created.path)) ?? null });
|
|
135
|
+
return created.name;
|
|
136
|
+
}),
|
|
137
|
+
}, name);
|
|
138
|
+
return turn.error;
|
|
139
|
+
}
|
|
140
|
+
/** Agent replies still being produced in this process. */
|
|
141
|
+
get pendingReplies() {
|
|
142
|
+
return this.inFlight;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A chat source for terminal clients; agent replies run here after each user message that needs one.
|
|
146
|
+
*/
|
|
147
|
+
source(options) {
|
|
148
|
+
const respond = (name) => {
|
|
149
|
+
if (!options.replies)
|
|
150
|
+
return;
|
|
151
|
+
// The harness turn runs unlocked (it can take minutes); its writes are scoped commits of their own paths.
|
|
152
|
+
this.inFlight++;
|
|
153
|
+
void this.reply(name, options.onActivity)
|
|
154
|
+
.then((error) => error && options.onReplyError?.(error), (error) => options.onReplyError?.(String(error)))
|
|
155
|
+
.finally(() => this.inFlight--);
|
|
156
|
+
};
|
|
157
|
+
return {
|
|
158
|
+
list: async () => await this.store.summaries(),
|
|
159
|
+
agents: async () => {
|
|
160
|
+
await this.reload();
|
|
161
|
+
return chatAgentChoices(this.catalog);
|
|
162
|
+
},
|
|
163
|
+
get: async (name) => await chatDetail(this.store, name),
|
|
164
|
+
create: async (agent, text, title) => {
|
|
165
|
+
const written = await this.locked(async () => {
|
|
166
|
+
await this.reload();
|
|
167
|
+
return await createUserChat(this.store, this.catalog, agent, text, { name: title });
|
|
168
|
+
});
|
|
169
|
+
await this.store.markRead(written.chat.name);
|
|
170
|
+
respond(written.chat.name);
|
|
171
|
+
return { name: written.chat.name, commit: written.commit };
|
|
172
|
+
},
|
|
173
|
+
send: async (name, text, expected) => {
|
|
174
|
+
const result = await this.locked(async () => await appendUserMessage(this.store, this.state, name, text, { expected }));
|
|
175
|
+
if (result.needsReply)
|
|
176
|
+
respond(result.written.chat.name);
|
|
177
|
+
return { name: result.written.chat.name, commit: result.written.commit };
|
|
178
|
+
},
|
|
179
|
+
read: async (name) => await this.store.markRead(name),
|
|
180
|
+
replies: options.replies,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/chats/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Project } from '../project/workspace.js';
|
|
2
|
+
import type { StateStore } from '../engine/state.js';
|
|
3
|
+
import type { ChatStore } from './store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Upgrades pending request records of older engines into agent-authored chats waiting for the user, once.
|
|
6
|
+
*
|
|
7
|
+
* The original agent, reason, answer options and task wait state are kept; nothing is answered on the user's behalf.
|
|
8
|
+
* Returns the number of migrated requests.
|
|
9
|
+
*
|
|
10
|
+
* @private chats
|
|
11
|
+
*/
|
|
12
|
+
export declare function migrateLegacyRequests(project: Project, chats: ChatStore, state: StateStore, takenNames: () => ReadonlySet<string>): Promise<number>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { listDirectory } from '../common/fs.js';
|
|
4
|
+
import { formatAgentReference, referenceName } from '../book/references.js';
|
|
5
|
+
/**
|
|
6
|
+
* Upgrades pending request records of older engines into agent-authored chats waiting for the user, once.
|
|
7
|
+
*
|
|
8
|
+
* The original agent, reason, answer options and task wait state are kept; nothing is answered on the user's behalf.
|
|
9
|
+
* Returns the number of migrated requests.
|
|
10
|
+
*
|
|
11
|
+
* @private chats
|
|
12
|
+
*/
|
|
13
|
+
export async function migrateLegacyRequests(project, chats, state, takenNames) {
|
|
14
|
+
let migrated = 0;
|
|
15
|
+
const records = [...(await state.readParked())];
|
|
16
|
+
const active = await state.readActive();
|
|
17
|
+
if (active)
|
|
18
|
+
records.push(active);
|
|
19
|
+
for (const entry of await listDirectory(project.runtime.requests)) {
|
|
20
|
+
if (!entry.isFile || !/^r-[a-z0-9]+\.json$/.test(entry.name))
|
|
21
|
+
continue;
|
|
22
|
+
const path = join(project.runtime.requests, entry.name);
|
|
23
|
+
let request;
|
|
24
|
+
try {
|
|
25
|
+
request = JSON.parse(await readFile(path, 'utf8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (request.status !== 'pending')
|
|
31
|
+
continue;
|
|
32
|
+
const agent = referenceName(request.origin?.agent ?? 'Fixer');
|
|
33
|
+
const created = await chats.create({
|
|
34
|
+
name: `${agent} asks: ${request.question.split('\n')[0].slice(0, 70)}`,
|
|
35
|
+
members: ['@User', formatAgentReference(agent)],
|
|
36
|
+
status: 'waiting-for-user',
|
|
37
|
+
links: request.origin?.taskTitle ? [`{{${request.origin.taskTitle}}}`] : [],
|
|
38
|
+
messages: [{ sender: formatAgentReference(agent), text: [request.reason, request.attempted ? `Already attempted: ${request.attempted}` : undefined, request.question].filter(Boolean).join('\n\n'), choices: request.choices?.length ? request.choices : undefined }],
|
|
39
|
+
taken: takenNames(),
|
|
40
|
+
trailers: request.origin?.taskTitle ? { 'Task-Name': request.origin.taskTitle } : undefined,
|
|
41
|
+
});
|
|
42
|
+
for (const record of records) {
|
|
43
|
+
const legacy = record;
|
|
44
|
+
const updates = {};
|
|
45
|
+
if (legacy.requestId === request.id)
|
|
46
|
+
Object.assign(updates, { waitingChat: created.chat.name, awaitedMessages: created.chat.messages.length, chats: [...(record.chats ?? []), created.chat.name] });
|
|
47
|
+
if (legacy.recoveryRequestId === request.id)
|
|
48
|
+
Object.assign(updates, { recoveryChat: created.chat.name, awaitedMessages: created.chat.messages.length });
|
|
49
|
+
if (!Object.keys(updates).length)
|
|
50
|
+
continue;
|
|
51
|
+
const updated = { ...record, ...updates };
|
|
52
|
+
if (record === active)
|
|
53
|
+
await state.writeActive(updated);
|
|
54
|
+
else
|
|
55
|
+
await state.writeParked(updated);
|
|
56
|
+
}
|
|
57
|
+
await writeFile(path, `${JSON.stringify({ ...request, status: 'cancelled', answer: `Migrated to the chat {{${created.chat.name}}}.` }, null, 2)}\n`);
|
|
58
|
+
migrated++;
|
|
59
|
+
}
|
|
60
|
+
return migrated;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/chats/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { AgentCatalog } from '../project/agents.js';
|
|
2
|
+
import type { ActiveRecord, StateStore } from '../engine/state.js';
|
|
3
|
+
import type { ChatStore, ChatSummary, ChatWrite } from './store.js';
|
|
4
|
+
/**
|
|
5
|
+
* A selectable target agent of a new chat.
|
|
6
|
+
*
|
|
7
|
+
* @private chats
|
|
8
|
+
*/
|
|
9
|
+
export type ChatAgentChoice = {
|
|
10
|
+
/** Display name. */
|
|
11
|
+
readonly name: string;
|
|
12
|
+
/** Reference to pass when creating the chat (`@Developer`, `{Frontend Developer}`). */
|
|
13
|
+
readonly reference: string;
|
|
14
|
+
/**
|
|
15
|
+
* `chatter` is the default partner of a new chat (offered first, chosen with Enter); `ordinary`, `hidden`
|
|
16
|
+
* (core/hidden agents) and `expert` are the alternatives behind "Choose another agent".
|
|
17
|
+
*/
|
|
18
|
+
readonly group: 'chatter' | 'ordinary' | 'hidden' | 'expert';
|
|
19
|
+
/** First goal of the agent, when declared. */
|
|
20
|
+
readonly description?: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* One chat with its complete messages, as shown by every client.
|
|
24
|
+
*
|
|
25
|
+
* @private chats
|
|
26
|
+
*/
|
|
27
|
+
export type ChatDetail = {
|
|
28
|
+
readonly summary: ChatSummary;
|
|
29
|
+
readonly messages: ReadonlyArray<{
|
|
30
|
+
readonly sender: string;
|
|
31
|
+
readonly at: string;
|
|
32
|
+
readonly text: string;
|
|
33
|
+
readonly choices?: readonly string[];
|
|
34
|
+
}>;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Agents the user may chat with: Chatter first (the default partner of a new chat, when it is a valid agent), then
|
|
38
|
+
* every alternative: visible ordinary agents, hidden/core agents and the engine-provided Expert. User, Void and Null
|
|
39
|
+
* are never offered.
|
|
40
|
+
*
|
|
41
|
+
* @private chats
|
|
42
|
+
*/
|
|
43
|
+
export declare function chatAgentChoices(catalog: AgentCatalog): ChatAgentChoice[];
|
|
44
|
+
/**
|
|
45
|
+
* The default partner of a new chat (Chatter), or an actionable diagnostic when it is missing or invalid. Another
|
|
46
|
+
* agent is never substituted silently, and nothing is created or initialized here.
|
|
47
|
+
*
|
|
48
|
+
* @private chats
|
|
49
|
+
*/
|
|
50
|
+
export declare function defaultChatAgent(choices: readonly ChatAgentChoice[]): ChatAgentChoice;
|
|
51
|
+
/**
|
|
52
|
+
* Reads one chat with its messages.
|
|
53
|
+
*
|
|
54
|
+
* @private chats
|
|
55
|
+
*/
|
|
56
|
+
export declare function chatDetail(store: ChatStore, name: string): Promise<ChatDetail>;
|
|
57
|
+
/**
|
|
58
|
+
* Starts a new user-led chat with exactly one agent (its first message is committed).
|
|
59
|
+
*
|
|
60
|
+
* @private chats
|
|
61
|
+
*/
|
|
62
|
+
export declare function createUserChat(store: ChatStore, catalog: AgentCatalog, agent: string, text: string, options?: {
|
|
63
|
+
readonly name?: string;
|
|
64
|
+
}): Promise<ChatWrite>;
|
|
65
|
+
/**
|
|
66
|
+
* Appends the user's message to a chat (one commit).
|
|
67
|
+
*
|
|
68
|
+
* In a chat waiting for the user, a reply matching the offered choices (or any reply when none were offered) answers
|
|
69
|
+
* it, reopens the chat and lets the waiting task resume; any other reply is a clarifying question for the agent.
|
|
70
|
+
* A failure-recovery decision accepts only one of its offered choices.
|
|
71
|
+
*
|
|
72
|
+
* @private chats
|
|
73
|
+
*/
|
|
74
|
+
export declare function appendUserMessage(store: ChatStore, state: StateStore, name: string, text: string, options?: {
|
|
75
|
+
readonly expected?: number;
|
|
76
|
+
}): Promise<{
|
|
77
|
+
readonly written: ChatWrite;
|
|
78
|
+
readonly waitingTask?: ActiveRecord;
|
|
79
|
+
readonly answered: boolean;
|
|
80
|
+
readonly needsReply: boolean;
|
|
81
|
+
}>;
|