Repository navigation
Replies: 5 comments
|
Thanks — this is the right place for it, and both symptoms turn out to be one contract break seen at two stages. Source-level answers below, in your four questions' order. 1. What changed (and why the replies went silent)One commit owns symptom 1 and predicts symptom 2:
Release boundary, bracketed on tags: not in Ownership is the part worth internalising: the consumer projects, the core only guarantees the settlement. After v2 the only durable text carrier is On live streaming specifically: 2. Session format generations
3. The minimal stable integration surface
For a chat channel that is complete: prompt in, durable events out,
ACP ( 4. Official Lark channel, compatibility matrix, CI probesThere is no first-party Lark/Feishu channel in this tree, and no per-channel probe in CI. What exists is One note on your point 3 ( |
|
Thanks — here is the resolved composition for the profile in the report (
So on this host the section is neither missing nor shadowed: exactly one declaration, contributed by the That moves point 3 off the composed tree. If Question back: should a channel plugin treat Full dump below (secrets are only dsh --profile dsh-lark --dump-config @ 0.2.0-rc.2# == @deepseek-ai/dsh-base
- id: tool-plugin-manager
name: '@deepseek-ai/dsh-plugin-manager/tools'
disabled: true
- id: plugin-manager
name: '@deepseek-ai/dsh-plugin-manager'
disabled: !!js '!ctx.get(''profileContext'')'
- id: timer
name: '@deepseek-ai/cordis-plugin-timer'
- id: hmr
name: '@deepseek-ai/dsh-hmr'
disabled: !!js '!ctx.get(''profileContext'')'
config:
root: []
- id: llm
name: '@deepseek-ai/dsh-llm'
- id: deepseek-llm-api-extensions
name: '@deepseek-ai/dsh-deepseek-llm-api-extensions'
- id: session
name: '@deepseek-ai/dsh-session'
- id: session-log-deepseek
name: '@deepseek-ai/dsh-session-log-deepseek'
- id: typert
name: '@deepseek-ai/dsh-typert-registry'
- id: typert-loader
name: '@deepseek-ai/dsh-typert-loader'
- id: typert-gateway
name: '@deepseek-ai/dsh-api-gateway'
- id: session-title
name: '@deepseek-ai/dsh-session-title'
config:
fallbackMaxWords: 5
fallbackMaxBytes: 40
maxTitleBytes: 80
- id: session-title-llm
name: '@deepseek-ai/dsh-session-title-first-prompt-llm'
config:
targetWords: 5
targetCjkCharacters: 10
maxInputBytes: 4096
maxOutputTokens: 64
timeoutMs: 60000
- id: user-questions
name: '@deepseek-ai/dsh-user-questions'
- id: agent
name: '@deepseek-ai/dsh-agent'
- id: plugin-package-inventory-deepseek
name: '@deepseek-ai/dsh-plugin-package-inventory-deepseek'
- id: agent-default-model
name: '@deepseek-ai/dsh-agent-default-model'
config:
provider: deepseek-official
model: deepseek-flash
- id: jobs
name: '@deepseek-ai/dsh-jobs-local'
- id: llm-retry
name: '@deepseek-ai/dsh-llm-retry'
- id: config-editor
name: '@deepseek-ai/dsh-config-editor'
disabled: !!js '!ctx.get(''profileContext'')'
- id: settings
name: '@deepseek-ai/dsh-settings'
disabled: !!js '!ctx.get(''profileContext'')'
- id: authorization
name: '@deepseek-ai/dsh-authorization'
- id: deepseek-account
name: '@deepseek-ai/dsh-deepseek-account-platform'
config:
desktopPlatform: !!js >-
ctx.get('profileContext')?.name === 'desktop' && ['darwin',
'win32'].includes(process.platform) ? process.platform : null
- id: credentials
name: '@deepseek-ai/dsh-credentials-local'
- id: llm-pi-ai
name: '@deepseek-ai/dsh-llm-pi-ai'
- id: session-persistence-jsonl
name: '@deepseek-ai/dsh-session-persistence-jsonl'
config:
root: !!js dshHomePath('sessions')
- id: attachment-local
name: '@deepseek-ai/dsh-attachment-local'
- id: session-query-sqlite
name: '@deepseek-ai/dsh-session-query-sqlite'
config:
path: ':memory:'
openAt: never
- id: session-projection
name: '@deepseek-ai/dsh-session-projection'
- id: storage
name: '@deepseek-ai/dsh-storage'
- id: storage-json
name: '@deepseek-ai/dsh-storage-json'
config:
root: !!js dshHomePath('storages')
- id: storage-domain
name: '@deepseek-ai/dsh-storage-domain'
config:
backend: json
- id: session-projection-cache
name: '@deepseek-ai/dsh-session-projection-cache'
config:
writeEveryEvents: 200
writeIntervalMs: 5000
- id: otel
name: '@deepseek-ai/dsh-otel'
- id: session-telemetry-otel
name: '@deepseek-ai/dsh-session-telemetry-otel'
config:
mode: !!js process.env.DSH_TELEMETRY_MODE || 'FEEDBACK_ONLY'
shutdownTimeoutMillis: 3000
maxRequestBytes: 4000000
exporter:
url: !!js >-
process.env.DSH_TELEMETRY_OTLP_URL ??
'https://dsh-otel-collector.deepseeksvc.com/v1/logs'
compression: gzip
timeoutMillis: 1000
processor:
scheduledDelayMillis: 10000
maxQueueSize: 2048
maxExportBatchSize: 2048
exportTimeoutMillis: 1500
- id: subprocess
name: '@deepseek-ai/dsh-subprocess-local'
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
- id: sandbox-policy
name: '@deepseek-ai/dsh-sandbox-policy'
config:
mode: !!js process.env.DSH_PERMISSION_MODE ?? 'workspace-write'
workspaceRoot: !!js process.cwd()
- id: bash-sandbox
name: '@deepseek-ai/dsh-bash-sandbox'
disabled: !!js process.platform === 'win32'
config:
timeoutMs: 60000
- id: pwsh-sandbox
name: '@deepseek-ai/dsh-pwsh-sandbox'
disabled: !!js process.platform !== 'win32'
- id: approval
name: '@deepseek-ai/dsh-user-approval'
config:
policy: !!js >-
(process.env.DSH_PERMISSION_MODE ?? 'workspace-write') ===
'danger-full-access' ? 'never' : 'ask'
- id: permission
name: '@deepseek-ai/dsh-permission-presets'
config:
presets:
read-only:
sandbox: read-only
approval: ask
workspace-write:
sandbox: workspace-write
approval: ask
danger-full-access:
sandbox: danger-full-access
approval: never
- id: shell-env
name: '@deepseek-ai/dsh-shell-env'
- id: tool-bash
name: '@deepseek-ai/dsh-tool-bash'
disabled: !!js process.platform === 'win32'
- id: tool-pwsh
name: '@deepseek-ai/dsh-tool-pwsh'
disabled: !!js process.platform !== 'win32'
- id: tool-jobs
name: '@deepseek-ai/dsh-tool-jobs'
- id: fs-observation-policy
name: '@deepseek-ai/dsh-fs-observation-policy'
- id: tool-fs
name: '@deepseek-ai/dsh-tool-fs'
- id: tool-fs-search
name: '@deepseek-ai/dsh-tool-fs-search'
config:
sampleOverCapGlobResults: false
- id: agent-instructions
name: '@deepseek-ai/dsh-agent-instructions'
config:
maxBytes: 65536
- id: skill
name: '@deepseek-ai/dsh-skill'
- id: skill-filesystem
name: '@deepseek-ai/dsh-skill-filesystem'
- id: skill-badge
name: '@deepseek-ai/dsh-skill-badge'
disabled: true
- id: tool-skill
name: '@deepseek-ai/dsh-tool-skill'
- id: commands
name: '@deepseek-ai/dsh-commands'
- id: command-feedback
name: '@deepseek-ai/dsh-command-feedback'
- id: goal
name: '@deepseek-ai/dsh-goal'
- id: goal-round-driver
name: '@deepseek-ai/dsh-goal-round-driver'
- id: command-goal
name: '@deepseek-ai/dsh-command-goal'
- id: plan-mode
name: '@deepseek-ai/dsh-plan-mode'
config:
section: >
You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or
the user switches the session mode. Imperative language to implement
changes means plan the implementation, not execute it. A user's
conversational agreement — including an answer confirming something you
asked — approves nothing and does not end plan mode; fold the confirmed
decision into the plan and submit it through exit_plan_mode.
Explore first. Use non-mutating reads, searches, static analysis, and
checks to ground the plan in the actual repository. Do not edit or write
files, change configuration, run formatters or code generation that
rewrites tracked files, commit, or otherwise carry out the plan. Prefer
existing functions and patterns over new machinery.
The tool catalog stays the same across modes for request-cache stability.
These plan-mode rules override any later tool description or guidance that
suggests using mutation tools; those tools remain listed only to keep the
request shape stable. Do not use todo_write to track this planning phase:
it tracks implementation after an approved plan, while the plan itself
belongs in exit_plan_mode.
Resolve discoverable facts by inspection. Use ask_user_question only for
user-owned choices or material ambiguity that inspection cannot answer. Do
not ask the user where code lives or how current behavior works when you
can find out.
Make the plan decision-complete: state the goal and success criteria;
group implementation changes by subsystem; identify public API, schema,
and data-flow changes; cover edge cases, failure modes, tests, acceptance
criteria, and explicit assumptions. Keep it concise enough to review but
detailed enough that another engineer can implement it without making
design decisions.
When ready, call exit_plan_mode with the complete plan markdown, starting
with a # title. Make exit_plan_mode the only and final tool call in that
assistant response: it presents the plan for approval, and implementation
begins only in a later step after approval. Do not paste the final plan as
a plain reply or ask "should I proceed?" through prose or
ask_user_question. If review rejects it, incorporate the feedback and
present again. If the review channel is unavailable or aborted, stay in
plan mode and ask the user to switch modes manually; do not proceed with
implementation.
- id: token-meter
name: '@deepseek-ai/dsh-token-meter'
# == @deepseek-ai/dsh-base, patched by D:\dsh-home\profiles\dsh-lark\cordis.patch.yml
- id: compaction-basic
name: '@deepseek-ai/dsh-compaction-basic'
config:
thresholdRatio: 0.8
retainTokens: 20000
maxTokens: 8192
auto: true
# == @deepseek-ai/dsh-base
- id: command-compact
name: '@deepseek-ai/dsh-command-compact'
- id: subagent
name: '@deepseek-ai/dsh-subagent'
- id: subagent-spawn-in-process
name: '@deepseek-ai/dsh-subagent-spawn-in-process'
config:
providerName: spawn
- id: subagent-fork-in-process
name: '@deepseek-ai/dsh-subagent-fork-in-process'
config:
providerName: fork
- id: tool-subagent-control
name: '@deepseek-ai/dsh-tool-subagent-control'
- id: tool-subagent-list-agents
name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
- id: tool-subagent
name: '@deepseek-ai/dsh-tool-subagent'
config:
provider: spawn
toolName: subagent
backgroundMode: continuable
- id: tool-subagent-fork
name: '@deepseek-ai/dsh-tool-subagent'
config:
provider: fork
toolName: subagent_fork
backgroundMode: one-shot
- id: ptc-runtime
name: '@deepseek-ai/dsh-ptc-runtime-node'
- id: workflow-ptc
name: '@deepseek-ai/dsh-workflow-ptc'
config:
provider: spawn
- id: tool-workflow
name: '@deepseek-ai/dsh-tool-workflow'
- id: timeout-policy
name: '@deepseek-ai/dsh-tool-call-timeout-policy'
- id: spill-local
name: '@deepseek-ai/dsh-spill-local'
# == @deepseek-ai/dsh-base, patched by D:\dsh-home\profiles\dsh-lark\cordis.patch.yml
- id: spill-policy
name: '@deepseek-ai/dsh-spill-policy'
config:
maxInlineBytes: 16000
# == @deepseek-ai/dsh-base
- id: session-checkpoint-policy
name: '@deepseek-ai/dsh-session-checkpoint-policy'
# == @deepseek-ai/dsh-base, patched by D:\dsh-home\profiles\dsh-lark\cordis.patch.yml
- id: tool-result-pruner
name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
config:
thresholdChars: 6000
headChars: 3500
tailChars: 900
# == @deepseek-ai/dsh-base
- id: image-offload
name: '@deepseek-ai/dsh-compaction-image-offload'
- id: tool-todo
name: '@deepseek-ai/dsh-tool-todo'
config:
allowParallelInProgress: true
- id: tool-goal
name: '@deepseek-ai/dsh-tool-goal'
- id: tool-ralph
name: '@deepseek-ai/dsh-tool-ralph'
disabled: true
config:
subagentProvider: spawn
maxRounds: 64
- id: repeat-tool-reminder
name: '@deepseek-ai/dsh-repeat-tool-reminder'
config:
thresholds:
- 3
- 5
- 8
argumentsPreviewChars: 500
- id: web
name: '@deepseek-ai/dsh-web'
config:
searchProvider: deepseek-official
fetchProvider: http
- id: web-search-deepseek
name: '@deepseek-ai/dsh-web-search-deepseek'
config:
apiKeyEnv: DEEPSEEK_API_KEY
- id: web-fetch-http
name: '@deepseek-ai/dsh-web-fetch-http'
- id: tool-web
name: '@deepseek-ai/dsh-tool-web'
config:
fetch: true
searchTimeoutMs: 60000
- id: mcp-resources
name: '@deepseek-ai/dsh-mcp-resources'
- id: tools
name: '@deepseek-ai/dsh-tools'
# == @deepseek-ai/dsh-base, patched by D:\dsh-home\profiles\dsh-lark\cordis.patch.yml
- id: system-prompt
name: '@deepseek-ai/dsh-system-prompt'
config:
persona: <redacted: local persona>
# == @deepseek-ai/dsh-base
- id: agent-loop
name: '@deepseek-ai/dsh-agent-loop'
config:
agents: []
- id: fs-sandbox
name: '@deepseek-ai/dsh-fs-sandbox'
- id: llm-deepseek
name: '@deepseek-ai/dsh-llm-deepseek-api-key'
- id: llm-deepseek-account
name: '@deepseek-ai/dsh-llm-deepseek-account'
# == dsh-lark-bot
- id: dsh-lark-bot
name: dsh-lark-bot/plugin
config:
profile: !!js process.env.DSH_LARK_PROFILE ?? 'default'
home: !!js process.env.DSH_LARK_HOME
tenant: !!js process.env.DSH_LARK_TENANT ?? 'feishu'
appId: !!js process.env.DSH_LARK_APP_ID
appSecret: !!js process.env.DSH_LARK_APP_SECRET
workspace: !!js process.env.DSH_LARK_WORKSPACE
adapter: !!js process.env.DSH_LARK_ADAPTER
model: !!js process.env.DSH_LARK_MODEL
scopeConcurrency: !!js >-
process.env.DSH_LARK_SCOPE_CONCURRENCY ?
Number(process.env.DSH_LARK_SCOPE_CONCURRENCY) : undefined
notificationDefault: !!js process.env.DSH_LARK_NOTIFICATION_DEFAULT
disabled: !!js process.env.DSH_LARK_DISABLED === '1'
- id: lark-notify
name: dsh-lark-bot/notify
config:
endpoint: !!js process.env.DSH_LARK_NOTIFY_URL
token: !!js process.env.DSH_LARK_NOTIFY_TOKEN
- id: lark-file
name: dsh-lark-bot/file
config:
endpoint: !!js process.env.DSH_LARK_FILE_URL
token: !!js process.env.DSH_LARK_NOTIFY_TOKEN
- id: lark-secret
name: dsh-lark-bot/secret
config:
endpoint: !!js process.env.DSH_LARK_SECRET_URL
token: !!js process.env.DSH_LARK_NOTIFY_TOKEN
- id: lark-ask
name: dsh-lark-bot/ask
config:
endpoint: !!js process.env.DSH_LARK_ASK_URL
token: !!js process.env.DSH_LARK_NOTIFY_TOKEN
# == dsh-lark-bot, patched by D:\dsh-home\profiles\dsh-lark\cordis.patch.yml
- id: lark-plan-approval
name: dsh-lark-bot/plan
config:
mode: 'off'
- id: lark-approval-answerer
name: dsh-lark-bot/approval
config:
endpoint: !!js process.env.DSH_LARK_APPROVAL_URL
token: !!js process.env.DSH_LARK_NOTIFY_TOKEN
disabled: true
|
|
跟进一下(第 1 次,我们上次发言至今约 72 小时,暂无新结论):0.2.0-rc.2 session v2 破坏性变更。这边仍在按生产同款管道复现,问题没有自行消失。 补充实测(隔离环境,与生产同款 如果短期排不上,给个方向性判断就够:0.19.x 在 0.2 下是否还会被支持?若明确不支持,我们就按整仓替换 fork 走,不再等。谢谢。 |
|
跟进一下(第 2 次,我们上次发言至今约 97 小时,暂无新结论):0.2.0-rc.2 session v2 破坏性变更。这边仍在按生产同款管道复现,问题没有自行消失。 补充实测(隔离环境,与生产同款 如果短期排不上,给个方向性判断就够:0.19.x 在 0.2 下是否还会被支持?若明确不支持,我们就按整仓替换 fork 走,不再等。谢谢。 |
|
跟进一下(第 3 次,我们上次发言至今约 97 小时,暂无新结论):0.2.0-rc.2 session v2 破坏性变更。这边仍在按生产同款管道复现,问题没有自行消失。 补充实测(隔离环境,与生产同款 如果短期排不上,给个方向性判断就够:0.19.x 在 0.2 下是否还会被支持?若明确不支持,我们就按整仓替换 fork 走,不再等。谢谢。 |
Uh oh!
There was an error while loading. Please reload this page.
背景
DSH 已经走到 0.2.x(npm
latest=0.2.0-rc.2,2026-09-29;next=0.2.1-rc.2,10-17),但飞书 / Lark 上用户量较大的第三方桥接dsh-lark-bot(最新0.19.16,2026-08-25)仍精确 pin@deepseek-ai/dsh-sdk-client@0.1.0-rc.8,其COMPATIBILITY.md也只声明0.1.0-rc.8。结果是:所有走飞书通道的用户都被锁在dsh@0.1.2-rc.1,无法跟进 0.2.x。这不是来要求官方维护第三方插件,而是想反馈一个生态层面的通道插件兼容缺口,并请教迁移口径。
实测现象(两代)
0.1.2-rc.1升到0.1.5-rc.1,重启后飞书侧回复 100% 静默丢失:turn 仍记为completed,日志、工具通道都正常,但用户收不到任何正文;回滚到0.1.2-rc.1立即恢复。PlutoKeating/dsh-lark-bot#158)显示,0.19.16 + dsh@0.2.0-rc.2下入站和工具卡片正常,但正文恒为(No content returned);会话日志里assistant/message有文本,桥接只投影了usage、没取content,且非流式运行时没有assistant/chunk兜底。Linux x64 与 macOS arm64 均已独立复现。#156):composed profile tree 里agent-default-model的配置没有被读取,settings.yaml兜底失效,需要DSH_LARK_PROVIDER/DSH_LARK_MODEL环境变量绕过。影响面
0.1.2-rc.1,拿不到 0.2.x 的能力,也装不了要求新代际的周边插件;0.2.0-rc.2,踩上面第 2 条;assistant/chunk、assistant/message、tool/*、审批/提问回调)与会话格式。跨代际时如果缺少公开的破坏性变更清单,第三方维护者只能靠实测和逆向,恢复周期很长。想请教(4 个问题)
0.1.0-rc.8→0.1.5→0.2.x,给通道插件用的 SDK 事件契约变更有没有正式说明?尤其是:assistant/chunk与assistant/message的语义与投影责任(谁负责把已提交消息的文本转成卡片正文);lark_notify这类 tool 回调)的代际差异。我们能配合的
DSH_HOME跑官方探针 / 兼容测试,回贴日志与事件样本;相关证据:
github.com/PlutoKeating/dsh-lark-bot/issues/158、/issues/156,以及我们 2026-09-15 的升级/回滚记录。All reactions