Skip to content

feat(agent-core-v2): bundle multiple skill activations into one prompt submission - #2934

Open
chengluyu wants to merge 4 commits into
mainfrom
feat/v2-multi-skill
Open

feat(agent-core-v2): bundle multiple skill activations into one prompt submission#2934
chengluyu wants to merge 4 commits into
mainfrom
feat/v2-multi-skill

Conversation

@chengluyu

@chengluyu chengluyu commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Related Issue

Resolve #1736

Problem

The client can only explicitly activate one skill per prompt. This is the first of two stacked PRs: it adds the engine-side capability for submitting one prompt together with multiple skill activations. A follow-up PR wires it up in the TUI.

What changed

Engine (packages/agent-core-v2)IAgentSkillService.promptWithSkills({ input, skills }):

  • Validates everything up front (empty prompt, empty skill list, or unknown skill → rejected with zero side effects).
  • Bundles every activation into the prompt's own user message: the rendered skill blocks precede the caller's parts in the message content, and each activation's metadata (activationId / skillName / skillArgs? / skillType? / skillPath? / skillSource?) rides the prompt origin's new skillActivations field.
  • Because the bundle is a single message, it is one turn and one undo anchor by construction — no grouping/correlation machinery in undo, compaction, replay, or checkpoints. The submit hook fires exactly once per submission.
  • skill.activated still fires per skill (transient, live-only ops); on resume the per-skill view is rebuilt from the prompt origin.
  • Standalone /skill activation is untouched.

Contract chain

  • packages/protocol: UserPromptOrigin.skillActivations + BundledSkillActivation (zod schemas; mirrored in kap-server's events-zod.ts).
  • packages/klient: agentSkillContract.promptWithSkills (non-empty skills via .min(1)) + facade method + parity assertions + PromptWithSkillsInput export.
  • packages/node-sdk: Session.promptWithSkills(input, skills) on the v2 session; the v1 base class throws not_implemented (v1 is being deprecated and is intentionally untouched).

No changes to packages/agent-core (v1). No TUI changes — those come in the follow-up PR stacked on this one.

Verification

  • tsc --noEmit on agent-core-v2
  • agent-core-v2: 5072 tests passed (316 files)
  • klient: all pass
  • node-sdk: 368 passed, 1 todo
  • pnpm run lint: 0 errors

Checklist

  • I have read the CONTRIBUTING document.
  • I have linked a related issue, or explained the problem above.
  • I have added tests that prove my feature works.
  • Ran gen-changesets skill, or this PR needs no changeset.
  • Ran gen-docs skill, or this PR needs no doc update.

Add IAgentSkillService.promptWithSkills: one or more skill activations
are validated up front (an unknown or empty submission rejects with no
side effects), recorded with a shared submissionId, and enqueued ahead
of the prompt through the prompt queue's messagesBefore support, so the
whole group materializes atomically as a single turn. Undo cuts, the
transcript projection, and the undo precheck treat the group as one
unit (stopping at the next anchor even when submission ids collide);
hook-result messages are skipped like injections during those walks.
Submit hooks run against every message of the group, and user-slash
skill activations count as user-submitted content for the UserPromptSubmit
hook's origin filter.

Surface it through the contract layers: protocol gains submissionId on
the user / skill_activation origins and on the skill.activated event
(kap-server zod mirrored), klient exposes agentSkillContract.promptWithSkills
with parity assertions, and the SDK grows session.promptWithSkills —
implemented on the v2 engine and rejecting loudly on the deprecated v1
engine, which is otherwise untouched.
@changeset-bot

changeset-bot Bot commented Aug 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0878ad6

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
@moonshot-ai/kimi-code-sdk Minor
@moonshot-ai/acp-adapter Patch
kimi-code Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@chengluyu

Copy link
Copy Markdown
Collaborator Author

@codex review

@pkg-pr-new

pkg-pr-new Bot commented Aug 14, 2026

Copy link
Copy Markdown
pnpm dlx https://pkg.pr.new/@moonshot-ai/kimi-code@0878ad6
npx https://pkg.pr.new/@moonshot-ai/kimi-code@0878ad6

commit: 0878ad6

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f2e0814ef1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/node-sdk/package.json Outdated
Comment thread packages/agent-core-v2/src/agent/contextMemory/contextOps.ts Outdated
Comment thread packages/agent-core-v2/src/agent/skill/skillService.ts Outdated
…sions

- Validate that promptWithSkills receives at least one skill, enforced in
  the engine and as a non-empty constraint in the klient wire schema.
- Restore the released versions and changelog sections for agent-core-v2,
  klient, and node-sdk that the branch cut had reverted.
- Move statement-level narration into the owning file headers per the
  package comment conventions.
- Align the hook-result undo tests with the reachable record ordering
  (hook results are recorded before the group materializes).
…ompt message

Replace the submissionId-correlated message group with a single bundled
user message: the rendered skill blocks precede the caller's parts in the
content, and every activation's metadata rides the prompt origin's new
skillActivations field. The bundle is one anchor by construction, so undo
needs no group-cutting logic and the messagesBefore prompt seam disappears;
the submit hook fires once per submission. skill.activated still fires per
skill (transient ops, live-only); resume rebuilds the per-skill view from
the prompt origin. Contract chain (protocol, kap-server, klient, node-sdk)
drops submissionId accordingly.
@chengluyu chengluyu changed the title feat(agent-core-v2): support grouped multi-skill prompt submissions feat(agent-core-v2): bundle multiple skill activations into one prompt submission Aug 14, 2026
@chengluyu

Copy link
Copy Markdown
Collaborator Author

Refactored the implementation approach based on design review feedback.

The previous revision correlated a group of messages (activations + prompt) via a shared submissionId and taught undo/replay to cut the group as one unit. That worked, but it spread grouping logic across every read-side consumer.

The new revision bundles the activations into the prompt's own user message: rendered skill blocks precede the caller's parts in the content, and per-skill metadata rides UserPromptOrigin.skillActivations. One message = one turn = one undo anchor by construction, so the submissionId machinery (group cutting in undo, anchor-stop guards, the messagesBefore prompt seam, replay grouping) is gone entirely. The submit hook now fires exactly once per submission.

What stayed the same: up-front validation with zero side effects, per-skill skill.activated events, queued-behind-busy semantics, v1 untouched.

Also addressed in the fixup commit: restored released package versions/changelogs, moved statement-level comments into file headers, reject skills: [] in engine + wire schema, aligned hook-result undo tests with reachable record ordering (those two tests were rewritten again by the refactor since group cutting no longer exists).

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b6603a1662

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/agent-core-v2/src/agent/skill/skillService.ts
Comment thread packages/agent-core-v2/src/agent/skill/skillService.ts
Comment thread packages/agent-core-v2/test/agent/skill/activateSkill.test.ts Outdated
Comment thread packages/agent-core-v2/src/agent/contextMemory/types.ts Outdated
…ojections

- The transcript cold rebuild expands a bundled prompt's origin
  skillActivations back into per-skill markers (the live path already
  projects them from skill.activated events).
- turn.started.prompt, the session title excerpt source, and the fork
  lastPrompt now derive from the caller's own parts, excluding the
  rendered skill blocks the engine prepends to the bundled content.
- Drop the redundant undefined unions from the new origin fields.
- Move the activateSkill test narration into the file header.
@chengluyu

Copy link
Copy Markdown
Collaborator Author

All review threads addressed in 0878ad6 (+ the earlier 14b851d fixup):

  • Released versions/changelogs restored (14b851d) — the branch cut had reverted the release commit's version bumps.
  • Statement-level comments moved into file headers; the engine test's scenario narration now lives in the test file's header block.
  • Empty skill list rejected (14b851d) — engine throws REQUEST_INVALID and the wire schema enforces .min(1).
  • Resume markers rebuilt — the transcript cold rebuild (groupTurns.ts) now expands a bundled prompt's origin.skillActivations back into per-skill skill markers, so cold sessions show the same cards the live events produced. (The TUI replay in stacked feat(kimi-code): recognize multiple inline skill activations in one prompt #2935 also rebuilds cards from the origin.)
  • Skill blocks out of prompt metadataturn.started.prompt, the session title excerpt source, and fork lastPrompt all derive from the caller's own parts now, excluding the prepended rendered skill blocks.
  • Redundant | undefined unions removed from the new origin fields.

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: 0878ad69d0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(tui): support inline multi-skill activation in a single prompt

1 participant