pi-roundtable 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +1 -2
  3. package/src/cli/checks/configuration.ts +2 -2
  4. package/src/cli/checks/database.ts +2 -2
  5. package/src/cli/checks/identity.ts +1 -1
  6. package/src/cli/checks/model.ts +1 -1
  7. package/src/cli/cli.ts +2 -2
  8. package/src/cli/principal.ts +1 -1
  9. package/src/cli/project.ts +2 -2
  10. package/src/cli/runtime.ts +3 -3
  11. package/src/cli/start.ts +1 -1
  12. package/src/core/agents/agent-claim.ts +4 -4
  13. package/src/core/agents/agent-dashboard.ts +3 -3
  14. package/src/core/agents/agent-messages.ts +2 -2
  15. package/src/core/agents/agent-outbox.ts +1 -1
  16. package/src/core/agents/agent-ports.ts +1 -1
  17. package/src/core/agents/agent-prompt.ts +4 -4
  18. package/src/core/agents/agent-rules.ts +1 -1
  19. package/src/core/agents/agent-schema.ts +4 -1
  20. package/src/core/agents/agent-settings.ts +2 -2
  21. package/src/core/agents/agent-store.ts +9 -9
  22. package/src/core/agents/agent-team-fixture.ts +4 -3
  23. package/src/core/agents/agent-team.ts +12 -16
  24. package/src/core/agents/agent-tools.ts +15 -15
  25. package/src/core/agents/avatar-refresh.ts +1 -1
  26. package/src/core/agents/avatar-studio.ts +2 -2
  27. package/src/core/agents/group-round.ts +2 -2
  28. package/src/core/agents/group-turns.ts +1 -1
  29. package/src/core/agents/helper-create.ts +24 -40
  30. package/src/core/agents/helper-modes.ts +2 -2
  31. package/src/core/agents/helper-preset-ops.ts +207 -0
  32. package/src/core/agents/helper-preset-tools.ts +109 -0
  33. package/src/core/agents/helper-presets.ts +128 -0
  34. package/src/core/agents/helper-test-kit.ts +1 -1
  35. package/src/core/agents/helper-tools.ts +42 -22
  36. package/src/core/agents/helper-work.ts +1 -1
  37. package/src/core/agents/message-target.ts +1 -1
  38. package/src/core/agents/routes.ts +1 -1
  39. package/src/core/agents/team-approval.ts +2 -2
  40. package/src/core/agents/team-editing.ts +2 -2
  41. package/src/core/agents/team-keys.ts +1 -1
  42. package/src/core/agents/team-layout.ts +1 -1
  43. package/src/core/agents/team-options.ts +4 -4
  44. package/src/core/agents/team-selection.ts +1 -1
  45. package/src/core/agents/team-status.ts +1 -1
  46. package/src/core/agents/team-text.ts +3 -3
  47. package/src/core/agents/team-turn-types.ts +7 -7
  48. package/src/core/agents/team-turns.ts +3 -3
  49. package/src/core/attachments/attachment-fetcher.ts +1 -1
  50. package/src/core/attachments/attachment-port.ts +2 -2
  51. package/src/core/attachments/attachment-retention.ts +3 -3
  52. package/src/core/attachments/attachment-store.ts +2 -2
  53. package/src/core/attachments/model-images.ts +1 -1
  54. package/src/core/attachments/turn-attachments.ts +1 -1
  55. package/src/core/builtin/agent-server.ts +17 -10
  56. package/src/core/builtin/channel-context.ts +2 -2
  57. package/src/core/builtin/discord-admin.ts +2 -2
  58. package/src/core/builtin/discord.ts +4 -3
  59. package/src/core/{identity/identity-plugin.ts → builtin/identity.ts} +15 -12
  60. package/src/core/builtin/modules.ts +12 -12
  61. package/src/core/builtin/prompts.ts +3 -3
  62. package/src/core/builtin/seeds.ts +1 -1
  63. package/src/core/builtin/session-tool.ts +1 -1
  64. package/src/core/builtin/skills.ts +3 -3
  65. package/src/core/builtin/stores.ts +10 -5
  66. package/src/core/builtin/threads.ts +2 -2
  67. package/src/core/builtin/worker-sessions.ts +3 -3
  68. package/src/core/config/access.ts +3 -3
  69. package/src/core/config/adapters.ts +1 -1
  70. package/src/core/config/config-schema.ts +9 -3
  71. package/src/core/config/config.ts +9 -10
  72. package/src/core/config/ops.ts +1 -1
  73. package/src/core/config/peer-bots.ts +74 -0
  74. package/src/core/config/routing.ts +1 -1
  75. package/src/core/contract/attachments.ts +1 -1
  76. package/src/core/contract/channels.ts +3 -5
  77. package/src/core/contract/runtime.ts +6 -6
  78. package/src/core/contract/surface.ts +3 -3
  79. package/src/core/conversations/conversation-registry.ts +1 -1
  80. package/src/core/conversations/conversation-retention.ts +2 -2
  81. package/src/core/conversations/conversation-store.ts +1 -1
  82. package/src/core/conversations/conversations-plugin.ts +2 -2
  83. package/src/core/db/migrations.ts +2 -2
  84. package/src/core/discord/agent-commands.ts +2 -2
  85. package/src/core/discord/agent-discord.ts +1 -1
  86. package/src/core/discord/agent-panel.ts +1 -1
  87. package/src/core/discord/card-audience.ts +1 -1
  88. package/src/core/discord/card-copies.ts +1 -1
  89. package/src/core/discord/channel-context.ts +1 -1
  90. package/src/core/discord/channel-executor.ts +1 -1
  91. package/src/core/discord/channel-operations.ts +1 -1
  92. package/src/core/discord/command-collection.ts +1 -1
  93. package/src/core/discord/compose-commands.ts +1 -1
  94. package/src/core/discord/context-images.ts +1 -1
  95. package/src/core/discord/discord-owners.ts +2 -2
  96. package/src/core/discord/discord-surface.ts +2 -2
  97. package/src/core/discord/member-events.ts +2 -2
  98. package/src/core/discord/message-changes.ts +1 -1
  99. package/src/core/discord/owner-cards.ts +1 -1
  100. package/src/core/discord/owner-command.ts +1 -1
  101. package/src/core/discord/schedule-commands.ts +1 -1
  102. package/src/core/domain/conversation.ts +5 -3
  103. package/src/core/{models.ts → domain/models.ts} +1 -1
  104. package/src/core/domain/ports.ts +2 -2
  105. package/src/core/{sessions.ts → domain/sessions.ts} +6 -6
  106. package/src/core/{define-roundtable.ts → host/define-roundtable.ts} +29 -29
  107. package/src/core/{drain.ts → host/drain.ts} +2 -7
  108. package/src/core/{events.ts → host/events.ts} +2 -2
  109. package/src/core/{host-background.ts → host/host-background.ts} +3 -3
  110. package/src/core/{host-registration.ts → host/host-registration.ts} +30 -30
  111. package/src/core/{host.ts → host/host.ts} +19 -15
  112. package/src/core/http/listeners.ts +2 -2
  113. package/src/core/http/websocket.ts +1 -1
  114. package/src/core/identity/access-policy.ts +8 -8
  115. package/src/core/identity/actor-facts.ts +1 -1
  116. package/src/core/identity/caching-principal-store.ts +1 -1
  117. package/src/core/identity/config-owner.ts +1 -1
  118. package/src/core/identity/contact.ts +2 -2
  119. package/src/core/identity/identity-links.ts +2 -2
  120. package/src/core/identity/identity-port.ts +2 -2
  121. package/src/core/identity/identity-schema.ts +1 -1
  122. package/src/core/identity/identity-service.ts +3 -3
  123. package/src/core/identity/identity-view.ts +1 -1
  124. package/src/core/{identity.ts → identity/owner-identity.ts} +1 -1
  125. package/src/core/identity/person-profiles.ts +1 -1
  126. package/src/core/identity/plugin-identities.ts +2 -2
  127. package/src/core/identity/principal-reads.ts +1 -1
  128. package/src/core/identity/principal-store.ts +1 -1
  129. package/src/core/identity/principal-types.ts +1 -1
  130. package/src/core/identity/seen-throttle.ts +1 -1
  131. package/src/core/{speakers.ts → identity/speakers.ts} +3 -6
  132. package/src/core/images/codex-images-plugin.ts +3 -3
  133. package/src/core/interactions/prompts.ts +1 -1
  134. package/src/core/judging/confirmation-judge.ts +1 -1
  135. package/src/core/judging/effort-judge.ts +2 -2
  136. package/src/core/judging/model-judge.ts +1 -1
  137. package/src/core/modes/conversation-modes.ts +4 -4
  138. package/src/core/modes/mode-inheritance.ts +1 -1
  139. package/src/core/modes/modes-plugin.ts +2 -2
  140. package/src/core/modules/background/background-turns.ts +4 -4
  141. package/src/core/modules/delegation/delegate.ts +3 -3
  142. package/src/core/modules/delegation/delegator.ts +4 -4
  143. package/src/core/modules/delegation/web-research-worker.ts +2 -2
  144. package/src/core/modules/delegation/worker-session.ts +5 -2
  145. package/src/core/modules/discord-admin/discord-admin.ts +1 -1
  146. package/src/core/modules/host-shell/shell-policy.ts +1 -1
  147. package/src/core/modules/memory/owner-memory-store.ts +1 -1
  148. package/src/core/modules/memory/owner-memory.ts +6 -3
  149. package/src/core/modules/notify/notify.ts +4 -1
  150. package/src/core/modules/notify/session-notify.ts +3 -3
  151. package/src/core/modules/prompts/prompt-documents.ts +1 -1
  152. package/src/core/modules/schedules/precheck-tools.ts +4 -4
  153. package/src/core/modules/schedules/prechecks.ts +2 -2
  154. package/src/core/modules/schedules/recurrence.ts +6 -1
  155. package/src/core/modules/schedules/schedule-prechecks.ts +4 -4
  156. package/src/core/modules/schedules/schedule-store.ts +2 -2
  157. package/src/core/modules/schedules/schedule-tools.ts +4 -4
  158. package/src/core/modules/schedules/scheduled-turn-text.ts +1 -1
  159. package/src/core/modules/schedules/scheduler.ts +3 -3
  160. package/src/core/modules/schedules/schedules.ts +5 -5
  161. package/src/core/modules/skills/missing-warning.ts +1 -1
  162. package/src/core/modules/skills/package-skills.ts +1 -1
  163. package/src/core/modules/skills/skill-registry.ts +2 -2
  164. package/src/core/modules/skills/skill-rules.ts +1 -1
  165. package/src/core/modules/skills/skill-tools.ts +1 -1
  166. package/src/core/ops/error-reporter.ts +2 -2
  167. package/src/core/ops/ops-alerts.ts +1 -1
  168. package/src/core/{define.ts → plugin-api/define.ts} +18 -20
  169. package/src/core/{event-types.ts → plugin-api/event-types.ts} +1 -1
  170. package/src/core/{holds.ts → plugin-api/holds.ts} +3 -3
  171. package/src/core/{plugin-removed.ts → plugin-api/plugin-removed.ts} +2 -2
  172. package/src/core/{plugin.ts → plugin-api/plugin.ts} +26 -26
  173. package/src/core/{services.ts → plugin-api/services.ts} +28 -28
  174. package/src/core/{tool-turn.ts → plugin-api/tool-turn.ts} +12 -5
  175. package/src/core/presence/delivery-router.ts +1 -1
  176. package/src/core/presence/direct-channels.ts +1 -1
  177. package/src/core/registry/chat-commands.ts +1 -1
  178. package/src/core/registry/contributions.ts +11 -11
  179. package/src/core/registry/providers.ts +2 -2
  180. package/src/core/registry/services.ts +2 -2
  181. package/src/core/registry/surface-service.ts +1 -1
  182. package/src/core/routing/actor-of.ts +1 -1
  183. package/src/core/routing/channel-queue.ts +2 -2
  184. package/src/core/routing/channel-router.ts +3 -3
  185. package/src/core/routing/claim-events.ts +2 -2
  186. package/src/core/routing/conversation-turns.ts +10 -6
  187. package/src/core/routing/forward-join.ts +1 -1
  188. package/src/core/routing/message-observers.ts +1 -1
  189. package/src/core/routing/message-text.ts +1 -1
  190. package/src/core/routing/peer-bots.ts +6 -74
  191. package/src/core/routing/queued-messages.ts +2 -2
  192. package/src/core/routing/settle-turn.ts +1 -1
  193. package/src/core/routing/surface-port.ts +3 -3
  194. package/src/core/runtime/ask-questions.ts +1 -1
  195. package/src/core/runtime/bridge-guard.ts +5 -5
  196. package/src/core/runtime/chat-only.ts +1 -1
  197. package/src/core/runtime/conversation-sessions.ts +2 -2
  198. package/src/core/runtime/extensions/agent-prompt.ts +1 -1
  199. package/src/core/runtime/extensions/ask-user-text.ts +5 -1
  200. package/src/core/runtime/extensions/ask-user.ts +4 -1
  201. package/src/core/runtime/extensions/card-ask.ts +1 -1
  202. package/src/core/runtime/extensions/confirmation-fixture.ts +1 -1
  203. package/src/core/runtime/extensions/confirmation-gate-extension.ts +1 -1
  204. package/src/core/runtime/extensions/confirmation-gate.ts +5 -5
  205. package/src/core/runtime/extensions/gate-refusals.ts +5 -2
  206. package/src/core/runtime/extensions/held-calls.ts +2 -2
  207. package/src/core/runtime/extensions/hold-describer.ts +3 -3
  208. package/src/core/runtime/extensions/hold-lookups.ts +4 -4
  209. package/src/core/runtime/extensions/persona-prompt.ts +1 -1
  210. package/src/core/runtime/extensions/prompt-read.ts +1 -1
  211. package/src/core/runtime/extensions/yolo.ts +1 -1
  212. package/src/core/runtime/interim-text.ts +1 -1
  213. package/src/core/runtime/pi-agent-runtime.ts +4 -4
  214. package/src/core/runtime/running-turn.ts +1 -1
  215. package/src/core/runtime/runtime-plugin.ts +13 -8
  216. package/src/core/runtime/runtime-types.ts +14 -10
  217. package/src/core/runtime/session-conversation.ts +3 -3
  218. package/src/core/runtime/session-factory.ts +5 -5
  219. package/src/core/runtime/thinking-level.ts +2 -2
  220. package/src/core/{tool-tiers.ts → runtime/tool-tiers.ts} +5 -5
  221. package/src/core/runtime/turn-answer.ts +1 -1
  222. package/src/core/runtime/turn-budget.ts +1 -1
  223. package/src/core/runtime/turn-limits.ts +1 -1
  224. package/src/core/runtime/turn-tools.ts +2 -2
  225. package/src/core/runtime/worker-task.ts +1 -1
  226. package/src/core/shared/attach-file-tool.ts +1 -1
  227. package/src/core/shared/delegate-tool.ts +1 -1
  228. package/src/core/shared/generate-image-tool.ts +1 -1
  229. package/src/core/{modules/background → shared}/personal-target.ts +2 -2
  230. package/src/core/{reply-files.ts → shared/reply-files.ts} +1 -1
  231. package/src/core/testing/eager-catalog.ts +1 -1
  232. package/src/core/testing/locale.ts +1 -1
  233. package/src/core/testing/map-identity.ts +5 -1
  234. package/src/core/testing/module-sessions.ts +3 -3
  235. package/src/core/testing/modules.ts +17 -13
  236. package/src/core/testing/owner.ts +2 -2
  237. package/src/core/testing/recording-logger.ts +1 -1
  238. package/src/core/testing/run-tool.ts +2 -2
  239. package/src/core/testing/surface-contract-support.ts +1 -1
  240. package/src/core/testing/surface-contract.ts +2 -2
  241. package/src/core/testing/test-host.ts +12 -12
  242. package/src/core/testing/thread-host.ts +1 -1
  243. package/src/core/testing/tool-set.ts +3 -3
  244. package/src/core/threads/dispatch-threads.ts +1 -1
  245. package/src/core/tool-set.snapshot.json +12 -0
  246. package/src/index.ts +76 -72
  247. package/src/kit/domain.ts +9 -9
  248. package/src/kit/holds.ts +4 -1
  249. package/src/kit/jev-judge.ts +1 -1
  250. package/src/kit/jev.ts +1 -1
  251. package/src/kit/presentation.ts +1 -1
  252. package/src/kit/support.ts +3 -3
  253. package/src/testing.ts +21 -20
  254. /package/src/core/{errors.ts → kernel/errors.ts} +0 -0
  255. /package/src/core/{freeze.ts → kernel/freeze.ts} +0 -0
  256. /package/src/core/{log.ts → kernel/log.ts} +0 -0
  257. /package/src/core/{time.ts → kernel/time.ts} +0 -0
@@ -1,13 +1,13 @@
1
1
  import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
2
  import { Type } from "typebox";
3
3
  import { AgentError } from "../../domain/errors.ts";
4
+ import type { SkillRegistry } from "../../plugin-api/services.ts";
4
5
  import {
5
6
  optionalString,
6
7
  requiredString,
7
8
  stringList,
8
9
  textToolsExtension,
9
10
  } from "../../runtime/text-tools.ts";
10
- import type { SkillRegistry } from "../../services.ts";
11
11
  import {
12
12
  MAX_SKILL_BODY_CHARS,
13
13
  type StoredSkillRegistry,
@@ -1,7 +1,7 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import type { ScheduledOutcome } from "../contract/channels.ts";
3
- import type { LogEntry, Logger } from "../log.ts";
4
- import type { ChannelKey } from "../sessions.ts";
3
+ import type { ChannelKey } from "../domain/sessions.ts";
4
+ import type { LogEntry, Logger } from "../kernel/log.ts";
5
5
  import { AlertThrottle } from "./alert-throttle.ts";
6
6
 
7
7
  /** Errors that are expected and never reported, matched against the message and the error's. */
@@ -1,4 +1,4 @@
1
- import type { Logger } from "../log.ts";
1
+ import type { Logger } from "../kernel/log.ts";
2
2
  import { AlertThrottle } from "./alert-throttle.ts";
3
3
 
4
4
  const DEFAULT_WINDOW_MS = 60 * 60_000;
@@ -2,22 +2,28 @@ import type { Static, TObject } from "typebox";
2
2
  import type {
3
3
  ToolAttachment,
4
4
  ToolAttachmentInfo,
5
- } from "./attachments/tool-attachment.ts";
6
- import type { ClientPort } from "./domain/client.ts";
7
- import type { ReplyFile } from "./domain/conversation.ts";
8
- import { PluginError } from "./errors.ts";
9
- import { type HoldDescription, type HoldRule, isPromise } from "./holds.ts";
10
- import { messages } from "./i18n/index.ts";
11
- import type { ApprovedBy } from "./interactions/prompts.ts";
12
- import { type RoundtablePlugin, refuseRemovedFields } from "./plugin.ts";
13
- import type { AgentTurnScope, ChannelKey, SessionTool } from "./sessions.ts";
5
+ } from "../attachments/tool-attachment.ts";
6
+ import type { ClientPort } from "../domain/client.ts";
7
+ import type { ReplyFile } from "../domain/conversation.ts";
8
+ import type {
9
+ AgentTurnScope,
10
+ ChannelKey,
11
+ SessionTool,
12
+ } from "../domain/sessions.ts";
13
+ import { messages } from "../i18n/index.ts";
14
+ import { type Speaker, TIERS, type Tier } from "../identity/speakers.ts";
15
+ import type { ApprovedBy } from "../interactions/prompts.ts";
16
+ import { PluginError } from "../kernel/errors.ts";
14
17
  import {
15
18
  type ToolOutput,
16
19
  toolError,
17
20
  toolOutput,
18
- } from "./shared/tool-result.ts";
19
- import { type Speaker, TIERS, type Tier } from "./speakers.ts";
20
- import { toolTurn } from "./tool-turn.ts";
21
+ } from "../shared/tool-result.ts";
22
+ import { type HoldDescription, type HoldRule, isPromise } from "./holds.ts";
23
+ import { type RoundtablePlugin, refuseRemovedFields } from "./plugin.ts";
24
+ import { ToolRefusal, toolTurn } from "./tool-turn.ts";
25
+
26
+ export { ToolRefusal };
21
27
 
22
28
  /** Tool names are lowercase words joined by underscores, like every tool the core ships. */
23
29
  const TOOL_NAME = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;
@@ -91,14 +97,6 @@ export interface ToolTurn {
91
97
  attachments?(): Promise<readonly ToolAttachmentInfo[]>;
92
98
  }
93
99
 
94
- /**
95
- * Thrown by a tool's `run` for a call the model should correct: the message becomes the tool's
96
- * error result, which the model reads. Any other error fails the call.
97
- */
98
- export class ToolRefusal extends Error {
99
- override name = "ToolRefusal";
100
- }
101
-
102
100
  export interface ToolSpec<Schema extends TObject> {
103
101
  /** Lowercase words joined by underscores; unique across every plugin. */
104
102
  name: string;
@@ -1,4 +1,4 @@
1
- import type { ChannelKey } from "./sessions.ts";
1
+ import type { ChannelKey } from "../domain/sessions.ts";
2
2
 
3
3
  /** One thing a person did through a plugin's surface, as a handler hears of it. */
4
4
  export interface ActionEvent {
@@ -1,7 +1,7 @@
1
+ import { type Tier, tierAtLeast } from "../identity/speakers.ts";
2
+ import type { ApprovalDetails } from "../interactions/prompts.ts";
3
+ import { PluginError } from "../kernel/errors.ts";
1
4
  import type { ToolTurn } from "./define.ts";
2
- import { PluginError } from "./errors.ts";
3
- import type { ApprovalDetails } from "./interactions/prompts.ts";
4
- import { type Tier, tierAtLeast } from "./speakers.ts";
5
5
 
6
6
  /**
7
7
  * How long the confirmation gate waits for a hold that looks things up before it describes the
@@ -1,5 +1,5 @@
1
- import type { ChatSurface } from "./contract/surface.ts";
2
- import { PluginError } from "./errors.ts";
1
+ import type { ChatSurface } from "../contract/surface.ts";
2
+ import { PluginError } from "../kernel/errors.ts";
3
3
  import type {
4
4
  Contribution,
5
5
  EventHandlers,
@@ -1,7 +1,7 @@
1
1
  import type { SQL } from "bun";
2
- import type { Hex } from "../characters/index.ts";
3
- import type { AgentSeed } from "./agents/agent-store.ts";
4
- import type { AttachmentPort } from "./contract/attachments.ts";
2
+ import type { Hex } from "../../characters/index.ts";
3
+ import type { AgentSeed } from "../agents/agent-store.ts";
4
+ import type { AttachmentPort } from "../contract/attachments.ts";
5
5
  import type {
6
6
  BackgroundTarget,
7
7
  ChannelClaim,
@@ -9,35 +9,35 @@ import type {
9
9
  MessageObserver,
10
10
  ObserveFilter,
11
11
  QueuePort,
12
- } from "./contract/channels.ts";
13
- import type { ChatCommand } from "./contract/chat-command.ts";
14
- import type { Providers, ResolvedProviders } from "./contract/providers.ts";
15
- import type { ServiceKey, Services } from "./contract/services.ts";
16
- import type { ChatSurface, SurfacePort } from "./contract/surface.ts";
17
- import type { Migration } from "./db/migrations.ts";
18
- import type { ToolContribution } from "./define.ts";
19
- import type { TurnProgress } from "./domain/progress.ts";
20
- import { PluginError } from "./errors.ts";
21
- import type { ActionEvent, MemberJoinedEvent } from "./event-types.ts";
22
- import type { HoldCheck, HoldRule } from "./holds.ts";
23
- import type { HttpRoute, ListenerAddress } from "./http/listeners.ts";
24
- import type { Locale } from "./i18n/index.ts";
25
- import type { Logger } from "./log.ts";
26
- import type {
27
- DirectChannelProvider,
28
- DirectChannels,
29
- } from "./presence/direct-channels.ts";
30
- import type { ConversationTurns } from "./routing/conversation-turns.ts";
12
+ } from "../contract/channels.ts";
13
+ import type { ChatCommand } from "../contract/chat-command.ts";
14
+ import type { Providers, ResolvedProviders } from "../contract/providers.ts";
15
+ import type { ServiceKey, Services } from "../contract/services.ts";
16
+ import type { ChatSurface, SurfacePort } from "../contract/surface.ts";
17
+ import type { Migration } from "../db/migrations.ts";
18
+ import type { TurnProgress } from "../domain/progress.ts";
31
19
  import type {
32
20
  AgentTurnScope,
33
21
  ChannelKey,
34
22
  SessionPlan,
35
23
  SessionTool,
36
24
  ToolSelection,
37
- } from "./sessions.ts";
38
- import type { ShellEnv } from "./shared/child-env.ts";
39
- import type { Speaker, Tier } from "./speakers.ts";
40
- import type { ToolTiers } from "./tool-tiers.ts";
25
+ } from "../domain/sessions.ts";
26
+ import type { HttpRoute, ListenerAddress } from "../http/listeners.ts";
27
+ import type { Locale } from "../i18n/index.ts";
28
+ import type { Speaker, Tier } from "../identity/speakers.ts";
29
+ import { PluginError } from "../kernel/errors.ts";
30
+ import type { Logger } from "../kernel/log.ts";
31
+ import type {
32
+ DirectChannelProvider,
33
+ DirectChannels,
34
+ } from "../presence/direct-channels.ts";
35
+ import type { ConversationTurns } from "../routing/conversation-turns.ts";
36
+ import type { ToolTiers } from "../runtime/tool-tiers.ts";
37
+ import type { ShellEnv } from "../shared/child-env.ts";
38
+ import type { ToolContribution } from "./define.ts";
39
+ import type { ActionEvent, MemberJoinedEvent } from "./event-types.ts";
40
+ import type { HoldCheck, HoldRule } from "./holds.ts";
41
41
 
42
42
  export type { ActionEvent, MemberJoinedEvent };
43
43
 
@@ -1,51 +1,51 @@
1
1
  import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
- import type { CharacterInput, CharacterSpec } from "../characters/index.ts";
3
- import type { Agent, AgentGroup } from "./agents/agent-rules.ts";
4
- import type { AvatarMode } from "./agents/agent-tools.ts";
5
- import type { HelperTeam } from "./agents/helper-ops.ts";
6
- import type { RoutingTable } from "./agents/routes.ts";
7
- import type { TeamStatus } from "./agents/team-status.ts";
8
- import type { ChannelContexts } from "./contract/channel-context.ts";
2
+ import type { CharacterInput, CharacterSpec } from "../../characters/index.ts";
3
+ import type { Agent, AgentGroup } from "../agents/agent-rules.ts";
4
+ import type { AvatarMode } from "../agents/agent-tools.ts";
5
+ import type { HelperTeam } from "../agents/helper-ops.ts";
6
+ import type { RoutingTable } from "../agents/routes.ts";
7
+ import type { TeamStatus } from "../agents/team-status.ts";
8
+ import type { ChannelContexts } from "../contract/channel-context.ts";
9
9
  import type {
10
10
  BackgroundRunsAs,
11
11
  ScheduledOutcome,
12
- } from "./contract/channels.ts";
13
- import type { AgentRuntime } from "./contract/runtime.ts";
14
- import { type ServiceKey, serviceKey } from "./contract/services.ts";
15
- import type { ConversationRegistry } from "./conversations/conversation-registry.ts";
16
- import type { PendingConfirmation } from "./domain/conversation.ts";
17
- import type { HttpRoute } from "./http/listeners.ts";
18
- import type { IdentityLinks } from "./identity/identity-links.ts";
19
- import type { IdentityService } from "./identity/identity-service.ts";
20
- import type { PersonProfiles } from "./identity/profiles.ts";
21
- import type { ThinkingLevel, ThinkingSetting } from "./models.ts";
22
- import type { ConversationModes } from "./modes/conversation-modes.ts";
12
+ } from "../contract/channels.ts";
13
+ import type { AgentRuntime } from "../contract/runtime.ts";
14
+ import { type ServiceKey, serviceKey } from "../contract/services.ts";
15
+ import type { ConversationRegistry } from "../conversations/conversation-registry.ts";
16
+ import type { PendingConfirmation } from "../domain/conversation.ts";
17
+ import type { ThinkingLevel, ThinkingSetting } from "../domain/models.ts";
18
+ import type { AgentTurnScope, ChannelKey } from "../domain/sessions.ts";
19
+ import type { HttpRoute } from "../http/listeners.ts";
20
+ import type { IdentityLinks } from "../identity/identity-links.ts";
21
+ import type { IdentityService } from "../identity/identity-service.ts";
22
+ import type { PersonProfiles } from "../identity/profiles.ts";
23
+ import type { Speaker } from "../identity/speakers.ts";
24
+ import type { ConversationModes } from "../modes/conversation-modes.ts";
23
25
  import type {
24
26
  DelegationJob,
25
27
  DelegationOutcome,
26
- } from "./modules/delegation/delegator.ts";
28
+ } from "../modules/delegation/delegator.ts";
27
29
  import type {
28
30
  Memory,
29
31
  MemoryKind,
30
32
  PromptMemory,
31
- } from "./modules/memory/owner-memory-store.ts";
33
+ } from "../modules/memory/owner-memory-store.ts";
32
34
  import type {
33
35
  PromptDocuments,
34
36
  PromptVersion,
35
- } from "./modules/prompts/prompt-documents.ts";
37
+ } from "../modules/prompts/prompt-documents.ts";
36
38
  import type {
37
39
  PrecheckFinding,
38
40
  PrecheckRegistry,
39
- } from "./modules/schedules/prechecks.ts";
41
+ } from "../modules/schedules/prechecks.ts";
40
42
  import type {
41
43
  NewSchedule,
42
44
  Schedule,
43
45
  ScheduleChange,
44
- } from "./modules/schedules/schedule-store.ts";
45
- import type { SkillRegistry } from "./modules/skills/skill-contract.ts";
46
- import type { AgentTurnScope, ChannelKey } from "./sessions.ts";
47
- import type { Speaker } from "./speakers.ts";
48
- import type { DispatchThreads } from "./threads/dispatch-threads.ts";
46
+ } from "../modules/schedules/schedule-store.ts";
47
+ import type { SkillRegistry } from "../modules/skills/skill-contract.ts";
48
+ import type { DispatchThreads } from "../threads/dispatch-threads.ts";
49
49
 
50
50
  // The services the built-in plugins provide, and the ports they keep to. Each port is an
51
51
  // interface, so an object with the same methods satisfies it without being one of the built-in
@@ -497,4 +497,4 @@ export interface SpeakerMemory {
497
497
  remove(text: string): Promise<string[]>;
498
498
  }
499
499
 
500
- export type { SkillRegistry } from "./modules/skills/skill-contract.ts";
500
+ export type { SkillRegistry } from "../modules/skills/skill-contract.ts";
@@ -2,12 +2,19 @@ import {
2
2
  AttachmentLookupError,
3
3
  listAttachments,
4
4
  openAttachment,
5
- } from "./attachments/tool-attachment.ts";
5
+ } from "../attachments/tool-attachment.ts";
6
+ import type { ClientPort } from "../domain/client.ts";
7
+ import type { SessionContext } from "../domain/sessions.ts";
8
+ import { attachReplyFile } from "../shared/reply-files.ts";
6
9
  import type { ToolTurn } from "./define.ts";
7
- import { ToolRefusal } from "./define.ts";
8
- import type { ClientPort } from "./domain/client.ts";
9
- import { attachReplyFile } from "./reply-files.ts";
10
- import type { SessionContext } from "./sessions.ts";
10
+
11
+ /**
12
+ * Thrown by a tool's `run` for a call the model should correct: the message becomes the tool's
13
+ * error result, which the model reads. Any other error fails the call.
14
+ */
15
+ export class ToolRefusal extends Error {
16
+ override name = "ToolRefusal";
17
+ }
11
18
 
12
19
  /**
13
20
  * `port` as a tool sees it in a turn: every call carries the turn's `signal` beside the caller's,
@@ -1,7 +1,7 @@
1
1
  import type { SurfacePort } from "../contract/surface.ts";
2
2
  import { parseChannelKey } from "../contract/surface.ts";
3
3
  import type { ChannelKey } from "../domain/conversation.ts";
4
- import type { Logger } from "../log.ts";
4
+ import type { Logger } from "../kernel/log.ts";
5
5
  import { splitReply } from "../presentation/reply-splitter.ts";
6
6
  import type {
7
7
  DirectChannelProvider,
@@ -1,6 +1,6 @@
1
1
  import type { SurfacePort } from "../contract/surface.ts";
2
2
  import type { ChannelKey } from "../domain/conversation.ts";
3
- import type { Logger } from "../log.ts";
3
+ import type { Logger } from "../kernel/log.ts";
4
4
  import { deliveryRouter } from "./delivery-router.ts";
5
5
 
6
6
  /**
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { dirname, join } from "node:path";
3
3
  import type { ChatCommand } from "../contract/chat-command.ts";
4
- import { PluginError } from "../errors.ts";
4
+ import { PluginError } from "../kernel/errors.ts";
5
5
  import { packageDir } from "../shared/package-dir.ts";
6
6
 
7
7
  const CHAT_COMMAND_NAME = /^[a-z][a-z0-9_-]*$/;
@@ -3,10 +3,16 @@ import type { AgentSeed } from "../agents/agent-store.ts";
3
3
  import type { BackgroundTarget, ChannelClaim } from "../contract/channels.ts";
4
4
  import type { ChatCommand } from "../contract/chat-command.ts";
5
5
  import type { ChatSurface } from "../contract/surface.ts";
6
- import type { ToolContribution } from "../define.ts";
7
- import { NotLinkedError, PluginError } from "../errors.ts";
8
- import { type HoldRule, holdChain } from "../holds.ts";
6
+ import {
7
+ compileSessionPlan,
8
+ type SessionTool,
9
+ type ToolSelection,
10
+ } from "../domain/sessions.ts";
9
11
  import type { HttpRoute } from "../http/listeners.ts";
12
+ import { TIERS } from "../identity/speakers.ts";
13
+ import { NotLinkedError, PluginError } from "../kernel/errors.ts";
14
+ import type { ToolContribution } from "../plugin-api/define.ts";
15
+ import { type HoldRule, holdChain } from "../plugin-api/holds.ts";
10
16
  import {
11
17
  CONTRIBUTION_KEYS,
12
18
  type Contribution,
@@ -21,19 +27,13 @@ import {
21
27
  refuseRemovedParts,
22
28
  refuseRemovedSurfaceMethods,
23
29
  type Service,
24
- } from "../plugin.ts";
30
+ } from "../plugin-api/plugin.ts";
25
31
  import {
26
32
  type DirectChannelProvider,
27
33
  directChannelsPort,
28
34
  } from "../presence/direct-channels.ts";
29
35
  import { refuseShellTools } from "../runtime/chat-only.ts";
30
- import {
31
- compileSessionPlan,
32
- type SessionTool,
33
- type ToolSelection,
34
- } from "../sessions.ts";
35
- import { TIERS } from "../speakers.ts";
36
- import type { ToolTierTable } from "../tool-tiers.ts";
36
+ import type { ToolTierTable } from "../runtime/tool-tiers.ts";
37
37
  import { ChatCommandSources, claimChatCommand } from "./chat-commands.ts";
38
38
  import { ServiceRegistry } from "./services.ts";
39
39
  import { surfaceService } from "./surface-service.ts";
@@ -3,9 +3,9 @@ import type {
3
3
  Providers,
4
4
  ResolvedProviders,
5
5
  } from "../contract/providers.ts";
6
- import { PluginError, ProviderError } from "../errors.ts";
7
6
  import { type JudgeModel, ModelJudge } from "../judging/model-judge.ts";
8
- import type { RoundtablePlugin } from "../plugin.ts";
7
+ import { PluginError, ProviderError } from "../kernel/errors.ts";
8
+ import type { RoundtablePlugin } from "../plugin-api/plugin.ts";
9
9
  import { nearest } from "./contributions.ts";
10
10
 
11
11
  const SLOTS = [
@@ -1,6 +1,6 @@
1
1
  import type { ServiceKey, Services } from "../contract/services.ts";
2
- import { NotLinkedError, PluginError } from "../errors.ts";
3
- import type { RoundtablePlugin } from "../plugin.ts";
2
+ import { NotLinkedError, PluginError } from "../kernel/errors.ts";
3
+ import type { RoundtablePlugin } from "../plugin-api/plugin.ts";
4
4
 
5
5
  /** The host's words for reading a service no plugin declares; `testPlugin` says how to give one instead. */
6
6
  const HOST_ADVICE =
@@ -1,5 +1,5 @@
1
1
  import type { ChatSurface } from "../contract/surface.ts";
2
- import type { PluginContext, Service } from "../plugin.ts";
2
+ import type { PluginContext, Service } from "../plugin-api/plugin.ts";
3
3
 
4
4
  /**
5
5
  * The surface as a service: it starts with the router's `handle` as its delivery, which drops
@@ -1,7 +1,7 @@
1
1
  import type { InboundMessage } from "../contract/channels.ts";
2
2
  import { parseChannelKey } from "../contract/surface.ts";
3
3
  import type { ActorFacts } from "../identity/actor-facts.ts";
4
- import type { Logger } from "../log.ts";
4
+ import type { Logger } from "../kernel/log.ts";
5
5
 
6
6
  /**
7
7
  * Who wrote the message, as its surface reports them; a surface that reports no `actor` has it
@@ -1,5 +1,5 @@
1
- import { HostStoppingError } from "../errors.ts";
2
- import type { ChannelKey } from "../sessions.ts";
1
+ import type { ChannelKey } from "../domain/sessions.ts";
2
+ import { HostStoppingError } from "../kernel/errors.ts";
3
3
 
4
4
  /** Runs tasks one at a time per channel, in arrival order; different channels run independently. */
5
5
  export class ChannelQueue {
@@ -14,12 +14,12 @@ import {
14
14
  STEERED_MARK,
15
15
  } from "../contract/channels.ts";
16
16
  import type { SurfacePort } from "../contract/surface.ts";
17
- import { HostStoppingError, PluginError } from "../errors.ts";
17
+ import type { ChannelKey } from "../domain/sessions.ts";
18
18
  import { messages } from "../i18n/index.ts";
19
19
  import type { Contact, ContactAssessor } from "../identity/contact.ts";
20
20
  import type { IdentityService } from "../identity/identity-service.ts";
21
- import type { Logger } from "../log.ts";
22
- import type { ChannelKey } from "../sessions.ts";
21
+ import { HostStoppingError, PluginError } from "../kernel/errors.ts";
22
+ import type { Logger } from "../kernel/log.ts";
23
23
  import { actorOf } from "./actor-of.ts";
24
24
  import { speakerOf } from "./background-speaker.ts";
25
25
  import type { ChannelQueue } from "./channel-queue.ts";
@@ -1,6 +1,6 @@
1
1
  import type { ChannelClaim, InboundMessage } from "../contract/channels.ts";
2
- import type { Logger } from "../log.ts";
3
- import type { ChannelKey } from "../sessions.ts";
2
+ import type { ChannelKey } from "../domain/sessions.ts";
3
+ import type { Logger } from "../kernel/log.ts";
4
4
 
5
5
  /** Tells the claim a message in its channel was deleted; a claim without the hook, or none, is skipped. Never rejects. */
6
6
  export async function tellDeleted(
@@ -9,14 +9,18 @@ import type { ClientPort } from "../domain/client.ts";
9
9
  import type { TurnResult } from "../domain/conversation.ts";
10
10
  import type { TurnConversation } from "../domain/ports.ts";
11
11
  import type { TurnProgress } from "../domain/progress.ts";
12
- import { HostStoppingError, PluginError } from "../errors.ts";
12
+ import type {
13
+ ChannelKey,
14
+ ToolSelection,
15
+ TurnSelection,
16
+ } from "../domain/sessions.ts";
13
17
  import { SYSTEM_PRINCIPAL } from "../identity/principal-store.ts";
14
- import type { Logger } from "../log.ts";
15
- import type { EventSink } from "../plugin.ts";
18
+ import type { Speaker } from "../identity/speakers.ts";
19
+ import { HostStoppingError, PluginError } from "../kernel/errors.ts";
20
+ import type { Logger } from "../kernel/log.ts";
21
+ import type { EventSink } from "../plugin-api/plugin.ts";
16
22
  import { isQuiet, replyBody } from "../presentation/reply-body.ts";
17
- import { withReplyFiles } from "../reply-files.ts";
18
- import type { ChannelKey, ToolSelection, TurnSelection } from "../sessions.ts";
19
- import type { Speaker } from "../speakers.ts";
23
+ import { withReplyFiles } from "../shared/reply-files.ts";
20
24
  import { endOf, settleTurn } from "./settle-turn.ts";
21
25
 
22
26
  /** One turn of a conversation, as a claim asks for it. */
@@ -1,5 +1,5 @@
1
1
  import type { InboundMessage } from "../contract/channels.ts";
2
- import type { ChannelKey } from "../sessions.ts";
2
+ import type { ChannelKey } from "../domain/sessions.ts";
3
3
 
4
4
  /** Discord sends a forward's added text as a second message right after the forward. */
5
5
  export const FORWARD_JOIN_MS = 2_000;
@@ -4,7 +4,7 @@ import type {
4
4
  ObserveFilter,
5
5
  } from "../contract/channels.ts";
6
6
  import { parseChannelKey } from "../contract/surface.ts";
7
- import type { Logger } from "../log.ts";
7
+ import type { Logger } from "../kernel/log.ts";
8
8
 
9
9
  interface Registered {
10
10
  filter: Readonly<ObserveFilter>;
@@ -1,6 +1,6 @@
1
1
  import { parseChannelKey } from "../contract/surface.ts";
2
2
  import type { ChannelKey, InboundMessage } from "../domain/conversation.ts";
3
- import type { OwnerIdentity } from "../identity.ts";
3
+ import type { OwnerIdentity } from "../identity/owner-identity.ts";
4
4
 
5
5
  /** How the model is told where a forward came from: a Discord channel as its mention, another surface's as its key. */
6
6
  function sourceLabel(source: ChannelKey): string {
@@ -1,80 +1,12 @@
1
1
  import {
2
- bool,
3
- either,
4
- type Field,
5
- integer,
6
- list,
7
- optional,
8
- shape,
9
- text,
10
- } from "../config/schema.ts";
2
+ DEFAULT_PEER_ROUNDS,
3
+ type PeerBotEntry,
4
+ type PeerBotsConfig,
5
+ peerBotsShape,
6
+ } from "../config/peer-bots.ts";
11
7
  import type { InboundMessage } from "../contract/channels.ts";
12
8
  import { parseChannelKey } from "../contract/surface.ts";
13
- import { ConfigError } from "../domain/errors.ts";
14
- import type { ChannelKey } from "../sessions.ts";
15
-
16
- /** One peer bot the host answers, and where. */
17
- export interface PeerBotEntry {
18
- /** The bot's user id on the surface, a Discord snowflake. */
19
- id: string;
20
- /** Answer it only in these servers; left out, in every server of the host. */
21
- guilds?: readonly string[];
22
- /** Answer it only in these channels; left out, in every channel. */
23
- channels?: readonly string[];
24
- /**
25
- * Leave to this bot a person's message that addresses both: when a person mentions or replies to
26
- * the host and in the same message mentions this bot or replies to it, the host starts no turn
27
- * (observers still hear the message), so only this bot answers and it can hand over by mentioning
28
- * the host. Where `guilds` and `channels` do not list the bot, the host does not yield to it.
29
- * Set it on one side only: two hosts that yield to each other both stay silent.
30
- */
31
- yields?: boolean;
32
- }
33
-
34
- /**
35
- * The other bots whose messages the host answers like a guest's. Explicit ids only: there is no
36
- * wildcard and no "all bots", and a host that leaves this out answers no bot.
37
- */
38
- export interface PeerBotsConfig {
39
- /** The peer bots, each by its user id or as an entry that limits it to servers or channels. */
40
- allow: readonly (string | PeerBotEntry)[];
41
- /**
42
- * The most messages from peer bots in a row, in one channel, that start a turn before the next
43
- * one is ignored; a person's message in the channel starts the count over. Default 3.
44
- */
45
- maxRounds?: number;
46
- }
47
-
48
- /** The rounds in a row a channel answers peer bots when the host does not say. */
49
- export const DEFAULT_PEER_ROUNDS = 3;
50
-
51
- const SNOWFLAKE = /^[0-9]{17,20}$/;
52
-
53
- /** A Discord id: 17 to 20 digits. */
54
- const snowflake: Field<string> = {
55
- describe: "a Discord id (17 to 20 digits)",
56
- check: (value, path) => {
57
- const id = text.check(value, path);
58
- if (!SNOWFLAKE.test(id))
59
- throw new ConfigError(
60
- `config ${path}: expected a Discord id (17 to 20 digits), got ${JSON.stringify(id)}. Copy the id with Developer Mode on; a name or a wildcard is not accepted. Fix the value in roundtable.config.ts.`,
61
- );
62
- return id;
63
- },
64
- };
65
-
66
- const entryShape = shape({
67
- id: snowflake,
68
- guilds: optional(list(snowflake)),
69
- channels: optional(list(snowflake)),
70
- yields: optional(bool),
71
- });
72
-
73
- /** `discord.peerBots`, or the `peerBots` of the host's options. */
74
- export const peerBotsShape = shape({
75
- allow: list(either(snowflake, entryShape)),
76
- maxRounds: optional(integer(1, 100)),
77
- });
9
+ import type { ChannelKey } from "../domain/sessions.ts";
78
10
 
79
11
  /**
80
12
  * The peer bots a host answers, and how many of their messages in a row a channel answers.
@@ -7,8 +7,8 @@ import {
7
7
  type QueuedChange,
8
8
  type QueuedMessage,
9
9
  } from "../contract/channels.ts";
10
- import type { Logger } from "../log.ts";
11
- import type { ChannelKey } from "../sessions.ts";
10
+ import type { ChannelKey } from "../domain/sessions.ts";
11
+ import type { Logger } from "../kernel/log.ts";
12
12
 
13
13
  type TurnAdmission = Extract<Admission, { kind: "turn" }>;
14
14
 
@@ -1,7 +1,7 @@
1
1
  import type { ScheduledOutcome } from "../contract/channels.ts";
2
2
  import type { TurnResult } from "../domain/conversation.ts";
3
3
  import { AgentRunError } from "../domain/errors.ts";
4
- import type { TurnEndEvent } from "../plugin.ts";
4
+ import type { TurnEndEvent } from "../plugin-api/plugin.ts";
5
5
 
6
6
  /** Runs a turn; a thrown error becomes its failed result, labelled `<what> crashed`. */
7
7
  export async function settleTurn<R>(
@@ -1,13 +1,13 @@
1
1
  import type { ChatSurface, SurfacePort } from "../contract/surface.ts";
2
2
  import { parseChannelKey } from "../contract/surface.ts";
3
- import { PluginError } from "../errors.ts";
3
+ import type { ChannelKey } from "../domain/sessions.ts";
4
+ import type { Speaker } from "../identity/speakers.ts";
4
5
  import {
5
6
  isPromptScope,
6
7
  type PromptScope,
7
8
  promptScope,
8
9
  } from "../interactions/prompts.ts";
9
- import type { ChannelKey } from "../sessions.ts";
10
- import type { Speaker } from "../speakers.ts";
10
+ import { PluginError } from "../kernel/errors.ts";
11
11
 
12
12
  export interface SurfacePortOptions {
13
13
  /** Told when a caller uses a form that goes away, such as `prompts(channel, speaker)`. */