@mogragsigma/dsh-dual-host-plugin 0.33.3 → 2.0.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 (98) hide show
  1. package/README.md +68 -97
  2. package/bundle/README.md +68 -97
  3. package/bundle/SETUP.md +87 -0
  4. package/bundle/approval-chat.js +2 -2
  5. package/bundle/approval-feishu.js +4 -1
  6. package/bundle/approval-ledger.js +30 -13
  7. package/bundle/approval-workbench.js +2 -0
  8. package/bundle/artifact-media.js +2 -2
  9. package/bundle/compatibility.json +47 -1
  10. package/bundle/configuration-v2.json +15 -0
  11. package/bundle/delivery-state.js +2 -0
  12. package/bundle/development-gate.js +2 -0
  13. package/bundle/distribution-lock.json +18 -18
  14. package/bundle/gateway-maintenance.js +1 -0
  15. package/bundle/global-rules/AGENTS.md +24 -20
  16. package/bundle/index.js +135 -25
  17. package/bundle/intervention-state.js +1 -1
  18. package/bundle/link-contract.js +9 -4
  19. package/bundle/managed-closeout.js +45 -0
  20. package/bundle/managed-cloud-policy.js +19 -0
  21. package/bundle/managed-command.js +71 -0
  22. package/bundle/managed-development-contract.js +43 -0
  23. package/bundle/managed-development.js +86 -0
  24. package/bundle/managed-endpoint.js +282 -0
  25. package/bundle/managed-execution.js +207 -0
  26. package/bundle/managed-policy.js +20 -0
  27. package/bundle/managed-runtime.js +186 -0
  28. package/bundle/managed-search.js +57 -0
  29. package/bundle/managed-tools.js +17 -0
  30. package/bundle/managed-triggers.js +85 -0
  31. package/bundle/native-context.js +4 -2
  32. package/bundle/native-entry.js +6 -2
  33. package/bundle/native-human-context.js +29 -0
  34. package/bundle/native-model-choice.js +12 -0
  35. package/bundle/native-rules/continuity.md +13 -0
  36. package/bundle/native-rules/execution.md +36 -0
  37. package/bundle/native-tools.js +52 -19
  38. package/bundle/notification-artifacts.js +26 -10
  39. package/bundle/notification-endpoint.js +1 -1
  40. package/bundle/notification-feishu.js +2 -2
  41. package/bundle/notification-media-endpoint.js +4 -3
  42. package/bundle/notification-observations.js +45 -0
  43. package/bundle/onboarding-cloud-package.js +1 -1
  44. package/bundle/onboarding-cloud.js +1 -1
  45. package/bundle/onboarding-file-contract.js +3 -2
  46. package/bundle/onboarding-file-transfer.js +4 -4
  47. package/bundle/onboarding-native-probe.js +1 -1
  48. package/bundle/onboarding-runtime-activation.js +1 -1
  49. package/bundle/onboarding-runtime-extension.js +2 -2
  50. package/bundle/package-lock.json +18 -18
  51. package/bundle/package.json +16 -14
  52. package/bundle/peer-file-review.js +1 -1
  53. package/bundle/peer-files.js +8 -4
  54. package/bundle/recovery.js +1 -1
  55. package/bundle/repository-gitee.js +12 -0
  56. package/bundle/repository-managed.js +1 -0
  57. package/bundle/runtime-im-lock.json +3409 -2849
  58. package/bundle/runtime-im-package.json +5 -5
  59. package/bundle/runtime-lock.json +3409 -2849
  60. package/bundle/runtime-package.json +5 -5
  61. package/bundle/schedule-ledger.js +35 -0
  62. package/bundle/search-contract.js +11 -1
  63. package/bundle/skills/task-approval/SKILL.md +20 -1
  64. package/bundle/skills/task-development/SKILL.md +30 -13
  65. package/bundle/skills/task-direct-link/SKILL.md +39 -13
  66. package/bundle/skills/task-file-transfer/SKILL.md +2 -2
  67. package/bundle/skills/task-notify/SKILL.md +2 -0
  68. package/bundle/skills/task-repository/SKILL.md +10 -1
  69. package/bundle/skills/task-research/SKILL.md +17 -2
  70. package/bundle/source-assessment.js +38 -0
  71. package/bundle/source-gitee.js +52 -0
  72. package/bundle/source-intake.js +137 -0
  73. package/bundle/source-policy-envelope.js +29 -0
  74. package/bundle/source-routing-tools.js +12 -0
  75. package/bundle/source-routing.js +218 -0
  76. package/bundle/source-search.js +2 -1
  77. package/bundle/store.js +6 -5
  78. package/bundle/task-artifacts.js +51 -12
  79. package/bundle/task-board.js +8 -4
  80. package/bundle/task-catalog.js +4 -3
  81. package/bundle/task-context.js +2 -2
  82. package/bundle/task-continuity-tools.js +14 -0
  83. package/bundle/task-continuity.js +248 -0
  84. package/bundle/task-envelope.js +31 -20
  85. package/bundle/task-notifications.js +6 -2
  86. package/bundle/task-observer-model.js +25 -0
  87. package/bundle/task-observer.js +120 -0
  88. package/bundle/task-results.js +1 -1
  89. package/bundle/task-scheduler.js +3 -3
  90. package/bundle/task-trigger-time.js +17 -12
  91. package/bundle/task-triggers.js +5 -30
  92. package/bundle/task-worker.js +10 -2
  93. package/bundle/task-workflows.js +2 -1
  94. package/bundle/workbench-client.js +165 -30
  95. package/bundle/workbench-decisions.js +22 -5
  96. package/bundle/worker-tools.js +8 -1
  97. package/compatibility.json +47 -1
  98. package/package.json +13 -13
@@ -8,6 +8,8 @@ export class WorkbenchApprovals {
8
8
  if(!object(args)||Object.keys(args).some(k=>!['task_id','request_id','expected_revision'].includes(k)))throw Error('APPROVAL_WORKBENCH_ARGUMENTS');
9
9
  const scoped=Object.keys(args).length>0;
10
10
  if(scoped&&(!(typeof args.task_id==='string'&&args.task_id.length<=128&&args.task_id)||!(typeof args.request_id==='string'&&args.request_id.length<=128&&args.request_id)||!Number.isSafeInteger(args.expected_revision)||args.expected_revision<1))throw Error('APPROVAL_WORKBENCH_ARGUMENTS');
11
+ if(scoped){const row=this.db.prepare('SELECT task_id,spec_revision FROM approval_requests WHERE id=?').get(args.request_id),head=this.db.prepare('SELECT spec_revision FROM task_catalog WHERE task_id=?').get(args.task_id);if(!row||row.task_id!==args.task_id||row.spec_revision!==args.expected_revision||head?.spec_revision!==args.expected_revision)throw Error('APPROVAL_WORKBENCH_CHANGED');}
12
+ if(scoped&&this.l.isNativeTask(args.task_id)){const r=this.l.view(args.request_id);if(r.task_id!==args.task_id||r.spec_revision!==args.expected_revision||this.l.catalog.head(args.task_id).spec_revision!==args.expected_revision)throw Error('APPROVAL_WORKBENCH_CHANGED');return {schema:2,enabled:true,identity_policy:'task-native',registration_required:false,new_browser_credential_required:false,approval_granted:false,execution_granted:false,read_only:true,next_action:{kind:'use_task_workbench',label:'在任务内处理',message:'通过当前已登录工作台或原生对话说明决定,无需 IM 身份确认。'}};}
11
13
  const chat=this.getChat(),binding=chat?.bindingHash?this.db.prepare('SELECT binding,disabled FROM approval_chat_bindings WHERE id=?').get(chat.bindingHash):null;
12
14
  const active=!!(binding?.disabled===0&&chat?.binding&&binding.binding===canonical(chat.binding)&&digest(chat.binding)===chat.bindingHash&&!chat.closed);
13
15
  const state=!chat?'not_configured':!active?'needs_review':chat.lastError?'unavailable':'configured';
@@ -25,10 +25,10 @@ export async function artifactSnapshot(g,task,id,mode){
25
25
  if(access.artifact.state!=='verified'||a.eligibility(r)!=='needs_verification'||access.artifact.sha256!==r.sha256)throw Error('NOTIFICATION_ARTIFACT_CHANGED');
26
26
  return {artifact_id:r.id,name:r.name,description:r.description,sha256:r.sha256,size:0,mode,spec_revision:r.spec_revision,mime:'text/uri-list',url:access.url};
27
27
  }
28
- const f=r.kind==='report'?a.readLocal(r):await g.repositories.provider.file(r.repository,r.path);a.assertOpen();
28
+ const f=['report','native_file'].includes(r.kind)?a.readLocal(r):await g.repositories.provider.file(r.repository,r.path);a.assertOpen();
29
29
  if(a.eligibility(r)!=='needs_verification'||f.bytes.length!==r.size||mediaHash(f.bytes)!==r.sha256||r.kind==='gitee'&&f.blob_sha!==r.blob_sha)throw Error('NOTIFICATION_ARTIFACT_CHANGED');
30
30
  if(mode==='page'&&r.kind!=='gitee')throw Error('NOTIFICATION_PAGE_UNAVAILABLE');
31
31
  const mime=mode==='image'?imageType(f.bytes):'application/octet-stream';
32
32
  if(mode==='image'&&!/\.(png|jpe?g)$/i.test(r.name))throw Error('ARTIFACT_INVALID_IMAGE');
33
- return {artifact_id:r.id,name:r.name,description:r.description??'暂无介绍',sha256:r.sha256,size:r.size,mode,spec_revision:r.spec_revision,mime,...(mode==='page'?{url:f.url}:{bytes:f.bytes})};
33
+ return {...(r.kind==='native_file'?{native_file:true}:{}),artifact_id:r.id,name:r.name,description:r.description??'暂无介绍',sha256:r.sha256,size:r.size,mode,spec_revision:r.spec_revision,mime,...(mode==='page'?{url:f.url}:{bytes:f.bytes})};
34
34
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "plugin": "@mogragsigma/dsh-dual-host-plugin",
4
- "version": "0.33.3",
4
+ "version": "2.0.0",
5
5
  "publicEntry": "native-entry.js",
6
6
  "hostBaseline": "0.2.1-rc.5",
7
7
  "imOptional": {
@@ -976,5 +976,51 @@
976
976
  "restart": "claimed operations need review; no replay",
977
977
  "productionDeployed": false,
978
978
  "realPlatformTest": "local isolated official Web roles + real test Feishu; not production ECS/Desktop"
979
+ },
980
+ "hostCompatibilityPolicy": {
981
+ "declaredRange": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
982
+ "standalonePinnedHost": "0.2.2-rc.1",
983
+ "targetHost": "0.2.2-rc.1",
984
+ "scope": "2.0.0 preparation, not published. Broad range admission is not per-version acceptance; see releaseContract and current acceptance report."
985
+ },
986
+ "releaseContract": {
987
+ "version": "2.0.0",
988
+ "stage": "unreleased-preparation",
989
+ "historicalFields": "Legacy approval/development/onboarding contracts remain for historical compatibility; they are not new-task policy or proof of 2.0 activation.",
990
+ "policy": "cloud-autonomous-v1",
991
+ "owner": "single-user",
992
+ "channels": [
993
+ "local-dsh-to-cloud",
994
+ "owner-local-im-to-cloud",
995
+ "owner-cloud-im-to-cloud"
996
+ ],
997
+ "execution": "cloud-only native DSH",
998
+ "taskImPermissions": "independent",
999
+ "modelCallLimit": null,
1000
+ "uniformTaskDeadline": null,
1001
+ "permissionReapprovalTTL": null,
1002
+ "concurrency": {
1003
+ "ordinary": 3,
1004
+ "humanFollowup": 1
1005
+ },
1006
+ "sessions": {
1007
+ "archiveIdleDays": 7,
1008
+ "automaticDelete": false
1009
+ },
1010
+ "setup": "bundle/SETUP.md and bundle/configuration-v2.json; explicit native profile configuration",
1011
+ "source": {
1012
+ "transport": "gitee-selected-issues",
1013
+ "maxIssuesPerSource": 8,
1014
+ "defaultMode": "off",
1015
+ "newTaskTotal": "explicitly confirmed finite per-period total, never model-call cap"
1016
+ },
1017
+ "legacyWizard": "Owned read-only runtime is historical; not the native cloud execution activation path",
1018
+ "supportEvidence": "DSH 0.2.2-rc.1; 0.2.1-rc.5 lower-bound validation tracked separately; selected Feishu dsh-im 5.9.1 real business evidence; not all platforms",
1019
+ "notSupported": [
1020
+ "reverse-local-managed-worker",
1021
+ "gitee-product-pr",
1022
+ "automatic-session-delete",
1023
+ "stateless-elastic-byom"
1024
+ ]
979
1025
  }
980
1026
  }
@@ -0,0 +1,15 @@
1
+ {
2
+ "local": [
3
+ {"id":"dual-host-onboarding","config":{"role":"local","entryMode":"native","namespace":"__PAIR_NAMESPACE__","stateDir":"__STATE_DIR__","tokenFile":"__TOKEN_FILE__","port":33911,"coordinatorUrl":"http://127.0.0.1:33921","workbench":{"enabled":true},"continuity":{"enabled":true},"managedExecution":{"enabled":true}}},
4
+ {"insert":[{"id":"dual-host-native-tools","name":"@mogragsigma/dsh-dual-host-plugin/native-tools"}]}
5
+ ],
6
+ "cloud": [
7
+ {"id":"dual-host-onboarding","config":{"role":"cloud","entryMode":"native","namespace":"__PAIR_NAMESPACE__","stateDir":"__STATE_DIR__","tokenFile":"__TOKEN_FILE__","port":33921,"workbench":{"enabled":true},"continuity":{"enabled":true},"managedExecution":{"enabled":true,"endpoint":{"lockPort":33923}},"sourceIntake":{"enabled":false,"sources":[]}}},
8
+ {"insert":[{"id":"dual-host-native-tools","name":"@mogragsigma/dsh-dual-host-plugin/native-tools"}]}
9
+ ],
10
+ "selectedSource": {
11
+ "id":"selected-gitee-issues","adapterId":"gitee-issues-v1","namespace":"gitee-repository-42","revision":"1","enabled":false,
12
+ "scopes":["https://gitee.com/example/synthetic-repository"],
13
+ "gitee":{"url":"https://gitee.com/example/synthetic-repository","repository_id":42,"issues":["IEXAMPLE"]}
14
+ }
15
+ }
@@ -1,3 +1,4 @@
1
+ import {managedResourceBusy} from './managed-development-contract.js';
1
2
  // Read-only persisted projection. No Git, filesystem observation, migration,
2
3
  // approval renewal, lease acquisition or execution callback is allowed here.
3
4
  import {canonical,digest} from './approval-ledger.js';
@@ -11,6 +12,7 @@ const codes=new Set(['EFFECT_UNKNOWN','DRAIN_REQUIRED','READBACK_UNKNOWN','READB
11
12
  export function deliveryWaiting(db,r,t){
12
13
  if(r.state==='needs_review'||t.blocked)return 'delivery_review';if(r.state!=='queued')return null;
13
14
  if(t.busy)return 'task_busy';
15
+ if(managedResourceBusy(db,r.resource))return 'managed_resource_busy';
14
16
  const owner=db.prepare("SELECT state FROM delivery_actions WHERE resource=? AND state IN ('active','needs_review')").get(r.resource);
15
17
  if(owner)return owner.state==='needs_review'?'delivery_resource_review':'delivery_resource_busy';
16
18
  if(has(db,'development_requests')){
@@ -1,3 +1,4 @@
1
+ import {managedResourceBusy} from './managed-development-contract.js';
1
2
  import {randomUUID} from 'node:crypto';
2
3
  import {canonical,digest} from './approval-ledger.js';
3
4
  import {approvedDevelopment} from './development-contract.js';
@@ -58,6 +59,7 @@ export class DevelopmentGate {
58
59
  if(this.unresolved(id)||this.inflight.has(id))return 'development_draining';
59
60
  if(r.state!=='queued')return null;
60
61
  if(t.busy||this.busy(r.task_id))return 'task_busy';
62
+ if(managedResourceBusy(this.db,r.resource))return 'managed_resource_busy';
61
63
  const owner=this.db.prepare("SELECT id,state FROM development_requests WHERE resource=? AND state IN ('active','needs_review')").get(r.resource);
62
64
  if(owner)return owner.state==='needs_review'?'development_resource_review':this.unresolved(owner.id)||this.inflight.has(owner.id)?'development_resource_draining':'development_resource_busy';
63
65
  // Optional journal shares the SAME database. Cutoff merges FIFO order across
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@mogragsigma/dsh-dual-host-plugin",
3
- "version": "0.33.3",
3
+ "version": "2.0.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@mogragsigma/dsh-dual-host-plugin",
9
- "version": "0.33.3",
9
+ "version": "2.0.0",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "dependencies": {
12
12
  "@js-temporal/polyfill": "0.5.1",
@@ -14,24 +14,24 @@
14
14
  "koffi": "3.1.1"
15
15
  },
16
16
  "engines": {
17
- "dsh": "0.2.1-rc.5"
17
+ "dsh": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0"
18
18
  },
19
19
  "peerDependencies": {
20
- "@deepseek-ai/dsh-agent": "0.2.1-rc.5",
21
- "@deepseek-ai/dsh-credentials": "0.2.1-rc.5",
22
- "@deepseek-ai/dsh-http-proxy": "0.2.1-rc.5",
23
- "@deepseek-ai/dsh-llm": "0.2.1-rc.5",
24
- "@deepseek-ai/dsh-llm-deepseek": "0.2.1-rc.5",
25
- "@deepseek-ai/dsh-llm-pi-ai": "0.2.1-rc.5",
26
- "@deepseek-ai/dsh-web-fetch-http": "0.2.1-rc.5",
27
- "@deepseek-ai/dsh-web-search-deepseek": "0.2.1-rc.5",
28
- "@earendil-works/pi-ai": "1.3.0"
20
+ "@deepseek-ai/dsh-llm": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
21
+ "@deepseek-ai/dsh-llm-deepseek": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
22
+ "@deepseek-ai/dsh-llm-pi-ai": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
23
+ "@earendil-works/pi-ai": ">=1.3.0 <1.6.0",
24
+ "@deepseek-ai/dsh-agent": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
25
+ "@deepseek-ai/dsh-credentials": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
26
+ "@deepseek-ai/dsh-http-proxy": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
27
+ "@deepseek-ai/dsh-web-fetch-http": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0",
28
+ "@deepseek-ai/dsh-web-search-deepseek": ">=0.2.1-rc.5 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0"
29
29
  },
30
30
  "peerDependenciesMeta": {
31
- "@deepseek-ai/dsh-agent": {
31
+ "@deepseek-ai/dsh-llm-pi-ai": {
32
32
  "optional": true
33
33
  },
34
- "@deepseek-ai/dsh-credentials": {
34
+ "@earendil-works/pi-ai": {
35
35
  "optional": true
36
36
  },
37
37
  "@deepseek-ai/dsh-http-proxy": {
@@ -40,19 +40,19 @@
40
40
  "@deepseek-ai/dsh-llm": {
41
41
  "optional": true
42
42
  },
43
- "@deepseek-ai/dsh-llm-deepseek": {
43
+ "@deepseek-ai/dsh-web-search-deepseek": {
44
44
  "optional": true
45
45
  },
46
- "@deepseek-ai/dsh-llm-pi-ai": {
46
+ "@deepseek-ai/dsh-agent": {
47
47
  "optional": true
48
48
  },
49
49
  "@deepseek-ai/dsh-web-fetch-http": {
50
50
  "optional": true
51
51
  },
52
- "@deepseek-ai/dsh-web-search-deepseek": {
52
+ "@deepseek-ai/dsh-credentials": {
53
53
  "optional": true
54
54
  },
55
- "@earendil-works/pi-ai": {
55
+ "@deepseek-ai/dsh-llm-deepseek": {
56
56
  "optional": true
57
57
  }
58
58
  }
@@ -17,6 +17,7 @@ export function createGatewayMaintenance(g,{now=Date.now}={}){
17
17
  deliveryPreparation:g.deliveryRuntime?.preparations.size??0,
18
18
  development:g.development?.gate.inflight.size??0,developmentPeer:g.developmentPeer?.pending.size??0,
19
19
  a2a:+!!g.a2aEndpoint?.pending+ +!!g.a2aEndpoint?.active+ +!!g.a2aEndpoint?.undrained,
20
+ managedExecution:g.execution?.slots.list().length??0,managedEndpoint:(g.executionEndpoint?.active.size??0)+ +!!g.executionEndpoint?.pending,
20
21
  approvals:+!!g.chatApproval?.running,artifacts:g.artifacts?.pending.size??0};
21
22
  }
22
23
  function status(a={}){if(!exact(a,[]))fail('ARGUMENTS');ready();const c=counts(),busy=Object.values(c).some(n=>n!==0);
@@ -2,30 +2,34 @@
2
2
  仅限本项目;保留用户规则、人格、记忆及原生功能。
3
3
  本机身份:__HOST_NAME__(Host role:__HOST_ROLE__);路由以 `task_identity` 为准,非昵称。
4
4
  Host 身份不证明渠道;云端 Web 也可接收 IM。无可靠渠道元数据须说“当前渠道未确认”,不按 localhost、环境提示或第三方 ID 猜测。
5
- ### 职责与入口
6
- - 本地大肥鱼负责本机;云端大肥鱼在 ECS 受理、查询、解释结果。指定本地不改投云端;Mac 离线另联系云端,不接管旧机器人。
7
- - 双端通信走自有插件直连;IM 是入口和通知渠道,不要求机器人同群。Gitee 保存开发版本和成果,不是消息总线、权威任务状态或并发锁。
8
- - 长任务交独立 worker,入口即返回,不用 shell 查实现/配置或 sleep/轮询。task_schedule 必填 max_runs 限总批次,每批≤6次模型请求;worker 处理检查点等待。短问答保留原功能。
9
- - 入口不能代 worker 计算并冒报完成。独立会话不等于独立 OS 进程;不得声称已经实现对 root、原生 Shell 或其他插件的系统级身份隔离。
5
+ ### 当前云端自主任务优先规则
6
+ - cloud-autonomous-v1:仅本地 DSH、本地 IM、云端 IM 三通道交办,统一云端执行;本地普通 DSH 保留,不反向派本地。
7
+ - task_submit 保留必要原文,task_execute 原生持续执行;task_followup 接续指示。无审批前置、调用次数上限、统一300秒截止或两小时到期重批;保留技术超时及业务期限。
8
+ - 云端原生 CLI/文件能力充分使用;IM 权限不决定任务执行。Git/远程托管可选;按约定交付并回读,不从研发推导发布。成果宿主登记,ready非已发送/已读。
9
+ - 以下旧审批、预算、短批、本地执行及Gitee门禁仅限历史合同;不套用于新任务,不迁移、删除或自动续跑历史。
10
+
11
+ ### 历史合同职责与入口
12
+ - 双端插件直连,IM只作入口/通知,不同群接力;Gitee非消息总线/权威状态/并发锁。
13
+ - 旧task_schedule保留max_runs及每批≤6次;入口不代worker冒报完成,不shell轮询。独立会话非OS进程或系统级身份隔离。
10
14
  ### 按需加载 Skill
11
15
  回执为准。
12
16
  | 用户需求 | Skill |
13
17
  | --- | --- |
14
- | 委派、按名称查询或修改任务;选择模型 | `task-direct-link` |
15
- | 周期、未来时间、事件、等待输入、有界子任务 | `task-schedule` |
16
- | 双端自主协作与共享预算 | `task-a2a` |
18
+ | 任务与模型 | `task-direct-link` |
19
+ | 计划与信号 | `task-schedule` |
20
+ | 历史A2A | `task-a2a` |
17
21
  | IM/本地/云端三端文件收发 | `task-file-transfer` |
18
- | 方案、自然语言批准/拒绝/暂缓/修改意见、回执引用 | `task-approval` |
19
- | 仓库关联、交付差异、提交和推送 | `task-repository` |
20
- | 已获授权的受管开发、修复与测试 | `task-development` |
21
- | 来源、联网研究、搜索阶段及证据 | `task-research` |
22
- | 通知目标、未知发送核对、图片/附件与手机入口 | `task-notify` |
23
- | 成果介绍、Gitee 页面或执行会话入口 | `task-artifacts` |
24
- | 云端 Web 工作台 | `task-workbench` |
25
- | 任务、双端、计划和交付状态展示 | `task-sidebar` |
26
- | 协议兼容、状态新鲜度、队列与回执诊断 | `task-diagnostics` |
27
- | 忙闲交接与中断核对 | `task-handoff`、`task-recovery` |
28
- | 导览、路径、凭据、安装与维护恢复、原事务回执 | `task-onboarding` |
22
+ | 历史审批 | `task-approval` |
23
+ | 仓库与交付 | `task-repository` |
24
+ | 研发与验证 | `task-development` |
25
+ | 来源与搜索 | `task-research` |
26
+ | 通知与回执 | `task-notify` |
27
+ | 成果取用 | `task-artifacts` |
28
+ | 云端工作台 | `task-workbench` |
29
+ | 任务展示 | `task-sidebar` |
30
+ | 诊断 | `task-diagnostics` |
31
+ | 交接与恢复 | `task-handoff`、`task-recovery` |
32
+ | 配置与维护 | `task-onboarding` |
29
33
 
30
34
  `task-worker`、`task-a2a-worker` 只在相应独立执行会话加载,入口不冒充 worker。
31
35
  `dsh-dual-end`、`task-intake` 仅作兼容指引;旧 `/task`、`/run`、`/approve`、群内 A2A、旧消费者和补丁流程不恢复、不自动重放。保留旧会话,不擅自改模式或清空历史。
@@ -34,7 +38,7 @@ Host 身份不证明渠道;云端 Web 也可接收 IM。无可靠渠道元数
34
38
  - 按名称交办/查询,无需 ID、命令、哈希或精确 provider;歧义才文字询问。任务名非关联键,内部参数仅取真实工具回执,不编造。
35
39
  - `task_submit` 的 goal 为理解摘要,Host 保全直接用户原文和约束。仅明确引用时补必要前文,不上传整段聊天或禁转内容。补充沿用原任务并修订;超限、非文本、缺能力须说明,不截断需求。
36
40
  - 新任务或显式换模型先用 `task_model_resolve` 核对目标端目录;“ds flash”等简称唯一匹配才用返回策略。歧义用接入名称澄清(导览 clarification),默认不传 provider_hint;不凭记忆、入口清单、近似版本或降级补齐。
37
- - 本项目 ECS 新任务未指定思考程度默认 high;显式值优先,不固定模型。历史任务、已批准方案及恢复批次保持原策略;不能支持所选程度则停止说明。辅助模型与搜索须单独声明策略和预算,既有例外不推广到其他任务。
41
+ - 新任务默认模型复用云端 DSH,显式值优先;恢复不换策略、不降级。辅助搜索单独声明路由;历史预算保留,新任务只统计。
38
42
  - 澄清使用普通聊天文字,不以飞书卡片、精确拼写或 ask_user_question 作为必经入口;此规则不拦截原生权限确认、第三方工具或斜杠命令。普通选择回复不是可信审批。
39
43
 
40
44
  ### 授权与可信审批