Commit Graph

3628 Commits

Author SHA1 Message Date
huanghuoguoguo
efdc3678b1 refactor(agent-runner): align config with agent semantics 2026-06-13 00:27:10 +08:00
huanghuoguoguo
c351a3daed refactor(agent-runner): remove host context windowing 2026-06-13 00:27:10 +08:00
huanghuoguoguo
bfa5db767c feat(agent-runner): normalize binding config boundaries 2026-06-13 00:27:10 +08:00
huanghuoguoguo
9caef840c7 fix: enforce agent run API permissions 2026-06-13 00:27:10 +08:00
huanghuoguoguo
0bc68f3d3a fix(agent-runner): authorize external runner tools 2026-06-13 00:27:10 +08:00
huanghuoguoguo
996a5f1c95 docs(agent-runner): document external MCP bridge 2026-06-13 00:27:10 +08:00
huanghuoguoguo
b27e9c80cb docs(agent-runner): align runner protocol boundaries 2026-06-13 00:27:10 +08:00
huanghuoguoguo
119fd9f482 docs(agent-runner): record codex runner smoke 2026-06-13 00:27:10 +08:00
huanghuoguoguo
a2b38f5bf2 fix(agent-runner): stabilize event context and streams 2026-06-13 00:27:10 +08:00
huanghuoguoguo
9bdebcdc5a docs(agent-runner): update pluginization design status 2026-06-13 00:27:09 +08:00
huanghuoguoguo
2fd2c6aadc refactor(agent-runner): tighten protocol v1 runtime boundaries 2026-06-13 00:27:09 +08:00
huanghuoguoguo
f9e07df539 feat(agent-runner): align protocol adapter terminology 2026-06-13 00:27:09 +08:00
huanghuoguoguo
d8d811e307 feat(agent-runner): route pipeline runs through event-first flow
- run_from_query() now delegates to run(event, binding) instead of maintaining
  a separate legacy execution path
- Pipeline Query is converted to AgentEventEnvelope via PipelineCompatAdapter
- Pipeline config is converted to AgentBinding with StatePolicy
- bound_plugins authorization preserved from Pipeline
- Legacy compatibility fields preserved:
  - query_id → context.runtime.query_id → session registry
  - prompt → context.compatibility.extra.prompt (not top-level)
  - params → context.compatibility.extra.params (with proper filtering)
  - max-round → bootstrap.messages and compatibility.legacy_messages
- Pipeline path gains event-first host capabilities:
  - EventLog and Transcript writing
  - ArtifactStore registration
  - PersistentStateStore for state.updated
- Removed legacy handlers:
  - _handle_artifact_created_query() (replaced by _handle_artifact_created)
  - _handle_state_updated() (replaced by _handle_state_updated_event)

This change unifies the execution path while preserving backward compatibility
for Pipeline-based runners. EventGateway is not implemented in this branch;
only the event-first entry point is reserved.
2026-06-13 00:27:09 +08:00
huanghuoguoguo
f23f343edc feat(agent-runner): add persistent state APIs 2026-06-13 00:27:09 +08:00
huanghuoguoguo
a7d90d196f feat(agent-runner): scope event-first state by binding 2026-06-13 00:27:09 +08:00
huanghuoguoguo
a7a359fb41 feat(agent-runner): persist created artifacts 2026-06-13 00:27:09 +08:00
huanghuoguoguo
e2712a8993 feat(agent-runner): add artifact store pull APIs 2026-06-13 00:27:09 +08:00
huanghuoguoguo
085a767f97 feat(agent-runner): add event-first context facts and pull APIs
Add EventLog and Transcript persistence entities for storing auditable
event facts and conversation history projection. Implement event-first
AgentRunContext builder that produces Protocol v1 compliant context
payloads with required fields: event, delivery, context (ContextAccess).

Key changes:
- EventLog ORM: auditable event records with indexes
- Transcript ORM: conversation history projection with composite indexes
- AgentRunContextBuilder: Protocol v1 payload with delivery, context, bootstrap
- EventLogStore/TranscriptStore: async stores for fact sources
- Host action handlers: HISTORY_PAGE, HISTORY_SEARCH, EVENT_GET, EVENT_PAGE
- Context validation: build_context output validates via SDK AgentRunContext
- Alembic migration for event_log and transcript tables
- Alembic env.py imports all ORM models for autogenerate discovery

Legacy compatibility: max-round messages go into bootstrap.messages and
compatibility.legacy_messages, not top-level messages field.
2026-06-13 00:27:09 +08:00
huanghuoguoguo
8b0f51641a docs(agent-runner): split protocol and context design 2026-06-13 00:27:09 +08:00
huanghuoguoguo
1b35ca67c5 fix(agent-runner): package context for plugin execution 2026-06-13 00:27:09 +08:00
huanghuoguoguo
4c98889566 feat: make agent runner config schema driven 2026-06-13 00:27:09 +08:00
huanghuoguoguo
7948291a08 chore(pipeline): clarify preferred default runner 2026-06-13 00:27:09 +08:00
huanghuoguoguo
07dcc0ec03 chore(agent): remove v1 wording from runner internals 2026-06-13 00:27:09 +08:00
huanghuoguoguo
e5b511de8f feat(agent): reserve stable runner event names 2026-06-13 00:26:44 +08:00
huanghuoguoguo
6f962c7028 docs: add phase1 qa report 2026-06-13 00:26:44 +08:00
huanghuoguoguo
195d1a9c8e feat(agent-runner): enrich plugin runner host context 2026-06-13 00:26:43 +08:00
huanghuoguoguo
d419ee4139 fix: log agent runner best-effort failures 2026-06-13 00:26:43 +08:00
huanghuoguoguo
0cdecbbf36 test: address agent runner review comments 2026-06-13 00:26:43 +08:00
huanghuoguoguo
563131ad52 fix: stabilize dynamic forms and mcp testing 2026-06-13 00:26:43 +08:00
huanghuoguoguo
33f4c0e028 refactor(modelmgr): simplify model sync logic and remove timeout configuration 2026-06-13 00:26:43 +08:00
huanghuoguoguo
565a6df77a fix(rag): align knowledge engine plugin actions 2026-06-13 00:26:43 +08:00
huanghuoguoguo
76582a578e feat: support dynamic agent runner defaults 2026-06-13 00:26:43 +08:00
huanghuoguoguo
056c63cd64 feat(toolmgr): add get_tool_by_name for unified tool lookup
Add unified tool lookup method that searches both plugin and MCP loaders.
Also add _get_tool method to MCPLoader for consistency with PluginToolLoader.
2026-06-13 00:26:43 +08:00
huanghuoguoguo
32161e2bfd docs: update PROGRESS.md - rerank support completed 2026-06-13 00:26:43 +08:00
huanghuoguoguo
d560a1eff3 feat(plugin): implement INVOKE_RERANK handler with run-scoped authorization
- Add invoke_rerank action handler in plugin handler
- Validate rerank model access via run session
- Cap documents at 64 for API limit
- Return sorted results by relevance score
2026-06-13 00:26:43 +08:00
huanghuoguoguo
d7f08cb29f docs(runner): mark legacy runners and add PROGRESS.md
- Add DEPRECATED docstring to all legacy runners in pkg/provider/runners/
- Mark migration target for each runner (local-agent, dify, n8n, coze, dashscope, langflow, tbox)
- Add PROGRESS.md to track agent-runner-pluginization implementation status
- Remove completed PHASE0_INTEGRATION_RECORD.md
2026-06-13 00:26:43 +08:00
huanghuoguoguo
790588fa22 perf(agent-runner): improve session registry and orchestrator efficiency
- Add pre-computed _authorized_ids (frozenset) at session registration for O(1) lookup
- Refactor is_resource_allowed() from linear search to set membership check
- Add thread-safe locking to get_session_registry() singleton
- Cache _session_registry and _state_store references in orchestrator __init__
- Add asyncio.gather() for parallel resource building in AgentResourceBuilder
- Create shared test fixtures in tests/unit_tests/agent/conftest.py
- Update test files to import from shared conftest.py

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-13 00:26:43 +08:00
huanghuoguoguo
78e6b9866b feat(agent-runner): integrate AgentRunner Protocol v1 with plugin system
Phase 0 integration complete - verified minimal loop with local-agent stub runner.

Changes:
- Add AgentRunOrchestrator for plugin-based agent execution
- Add AgentResultNormalizer for Protocol v1 result conversion
- Add AgentRunnerDescriptor for runner ID parsing (plugin:author/name/runner)
- Update chat handler to use new orchestrator instead of direct runner lookup
- Add plugin handler methods for list_agent_runners and run_agent
- Add connector methods for AgentRunner protocol forwarding
- Update pipeline API to include runner options in metadata
- Add integration docs and implementation plan

Integration verified:
- Runner: plugin:langbot/local-agent/default
- Input: "你好"
- Output: [stub] Echo: 你好
- Date: 2026-05-10 10:09

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-13 00:25:06 +08:00
Junyan Qin
e1501f86c5 docs: record agent runner design decisions 2026-06-13 00:21:52 +08:00
Junyan Qin
92f9cd9626 docs: design agent runner pluginization 2026-06-13 00:21:52 +08:00
Junyan Qin
6244ee4985 chore: stash code 2026-06-13 00:21:52 +08:00
RockChinQ
2b6dcfe9c7 feat(survey): add bot_response_success_100 milestone trigger event
Counts successful non-WebSocket bot responses (persisted in the metadata
table as survey_bot_response_count, survives restarts) and fires the
bot_response_success_100 survey event once the instance reaches 100
responses. Counting stops after the milestone has been triggered.

Existing first_bot_response_success behavior unchanged. 6 new unit tests.
2026-06-12 09:40:07 -04:00
RockChinQ
dd96da895c feat(telemetry): payload v2 with feature usage counters and instance heartbeat
Per-query events now carry event_type='query' and a features JSON object:
- tool_calls by source (native/plugin/mcp/skill) via ToolManager
- tool_call_rounds, kb usage (count/engine plugins/retrieved entries) via local-agent
- sandbox execs/errors via BoxService
- activated_skills and bound mcp_servers snapshots

New instance_heartbeat event (startup + daily) reports anonymous instance
profile: deploy platform, database/vdb kind, box backend/availability,
adapter type names, and resource counts. Respects space.disable_telemetry.

All collection helpers are defensive and never break the pipeline.
Verified: ruff, 37 telemetry unit tests (13 new), 504 box/provider/pipeline tests.
2026-06-12 08:11:43 -04:00
Junyan Qin
bca710dbd4 feat(platform): show deployment outbound IPs on adapter config forms
Cloud/NAT deployments couldn't complete WeCom-family / Official Account /
QQ Official setup because the trusted-IP (IP whitelist) value — the
server's egress IPs — was nowhere visible in LangBot.

- config.yaml: new system.outbound_ips list (env: SYSTEM__OUTBOUND_IPS,
  comma-separated), exposed via GET /api/v1/system/info
- dynamic form: generic __system.*-named display-only fields resolved
  from systemContext (same namespace as show_if), one read-only row per
  value with a copy button, excluded from form state and emitted values;
  hidden entirely when the deployment provides no IPs
- manifests: trusted-IP display field for wecom, wecomcs, wecombot,
  officialaccount, qqofficial

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 19:41:17 +08:00
RockChinQ
47ade18596 fix(log): roll daily log file at midnight for long-running processes
The log filename was computed once at init_logging() startup and the
RotatingFileHandler only rotated by size, so a process running across
midnight kept appending every subsequent day's logs to the start-day
file (langbot-<start date>.log). No file ever appeared for the current
day until the process was restarted, confusing users into thinking
logging had stopped.

Replace RotatingFileHandler with DailyGroupedRotatingFileHandler, which
switches to langbot-<current date>.log when the local date changes while
still doing size-based numbered rotation within a day. On-disk naming
stays compatible with the maintenance log-retention cleanup
(LOG_FILE_PATTERN). Adds regression tests.
2026-06-10 04:58:11 -04:00
Junyan Qin
733c9cdf16 fix(ci): trigger CLA check on PR reopen
Allows attaching the required CLA status to pull requests opened
before the workflow existed, by closing and reopening them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 12:10:52 +08:00
Junyan Qin
bbc508d42f feat: add Contributor License Agreement (CLA) and signing workflow
Introduce an individual CLA (license-grant style, based on Apache ICLA
v2.2) with English as the authoritative text and a Chinese reference
translation. Contributors sign by replying to a bot comment on their
first PR; signatures are recorded in the langbot-app/cla repository
and cover all repositories in the organization.

- CLA.md: agreement text (grantee: Beijing Langbo Intelligent
  Technology Co., Ltd.)
- .github/workflows/cla.yml: contributor-assistant action pinned to
  v2.6.1, signatures stored remotely in langbot-app/cla
- CONTRIBUTING.md / PR template: bilingual CLA notice

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 11:49:30 +08:00
RockChinQ
0551d22689 chore(release): bump version to 4.10.1 v4.10.1 2026-06-09 13:32:58 -04:00
RockChinQ
53d4edb609 fix(dify): send 'user' as plain form field in file upload
The multipart tuple form (None, user) is httpx 'files=' syntax for a part
with no filename; placed under 'data=' it expanded into a stray user=None
field, so Dify associated the uploaded file with the wrong user and the
workflow never received the image. Send 'user' as a plain string.
2026-06-09 10:43:55 -04:00
RockChinQ
f897987ac1 chore(deps): bump langbot-plugin to 0.4.2 (stable) 2026-06-09 09:52:07 -04:00