@xdxer/dingtalk-agent 0.1.4-beta.13 → 0.1.4-beta.15

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  All notable changes to `@xdxer/dingtalk-agent` are documented here. The project follows semantic versioning; prerelease entries describe release candidates and do not imply that Live canaries or registry publication have completed.
4
4
 
5
+ ## 0.1.4-beta.15 - 2026-07-19
6
+
7
+ ### Added
8
+
9
+ - Multica endpoint resolution and display: `agent-platform show|use` now print the resolved endpoint and its source unconditionally — even when multica is not installed or logged in — so you always know where you'd connect and how to switch. `resolveEndpoint()` uses a single source of truth aligned with the executor (`multica_ext.py` reads `MULTICA_SERVER_URL`/`--profile`): `MULTICA_SERVER_URL` env > project config (`dingtalk-agent.json#multicaEndpoint` or `.dingtalk-agent/agent-platform.json.endpoint`) > exactly one logged-in profile's server_url (multiple = ambiguous, never auto-picked) > the platform's suggested endpoint (pre, flagged unconfirmed, never a silent direct-connect). The login readiness hint emits a full copyable `multica login --server-url <resolved> --token ...` with the source annotated.
10
+ - The project manifest gains an optional `multicaEndpoint` field (schema + validation) for a persistent per-project endpoint override.
11
+
12
+ ### Changed
13
+
14
+ - Scattered pre-fde endpoint literals in `PLATFORM.md` and the compose skill now point to `dta agent-platform show` as the single source instead of hardcoding the URL, so docs cannot drift from the resolver.
15
+
16
+ ### Release boundary
17
+
18
+ - Distribution is limited to the public npm `beta` dist-tag, a Git tag, and a GitHub pre-release. The suggested endpoint is an explicitly-unconfirmed hint only; the executor stays fail-closed and deploy-time confirmation is unchanged. Live waivers from beta.9 remain unchanged.
19
+
20
+ ## 0.1.4-beta.14 - 2026-07-19
21
+
22
+ ### Added
23
+
24
+ - Per-platform `PLATFORM.md`: switching to a platform now loads a document explaining what each bundled skill does. `agent-platform use|show` print the doc path, and `list|show` display every skill's role and purpose (the registry skill bindings gained a `purpose` field). `multica-dingtalk`'s doc covers the three skills by role, the delivery chain, readiness, the dws-first robot-binding priority (including `--allow-unbound` for connect-to-customers mode), DWS-conversation acceptance, and both unbind paths; `deap` is a coming-soon stub.
25
+
26
+ ### Fixed
27
+
28
+ - `multica-external`'s `dingtalk-bind` now sends `robot_code` (defaulting to `client_id`, with a `--robot-code` flag). Manual robot binding previously failed with `400 robot_code is required`, blocking real DingTalk robot delivery; a live 10-chain regression on the pre environment now confirms real DWS→robot→agent replies.
29
+
30
+ ### Validated
31
+
32
+ - End-to-end regression on the dedicated pre environment (authorized): from-zero token login, ten role-diverse agents each carrying basic-behavior (verified silent on un-@mentioned group messages), DWS-created robots bound via the dws path with credentials, and acceptance by real DWS conversation. Five robots were reused via revoke+rebind, confirming messages reroute to the newly bound agent. Both unbind APIs (robot `dingtalk-revoke`, account `dingtalk-account-unbind`) were confirmed.
33
+
34
+ ### Release boundary
35
+
36
+ - Distribution is limited to the public npm `beta` dist-tag, a Git tag, and a GitHub pre-release. The regression's platform side effects (agents, robot bindings, messages) occurred only on the user-authorized pre environment with dedicated test objects. Live waivers from beta.9 remain unchanged.
37
+
5
38
  ## 0.1.4-beta.13 - 2026-07-19
6
39
 
7
40
  ### Changed
@@ -39,7 +39,7 @@ import { checkpointTask, showTaskCheckpoint } from '../src/memory/task-checkpoin
39
39
  import { upsertOperationalMemory } from '../src/memory/operational.js';
40
40
  import { proposeMemoryCandidate, publishMemoryCandidate, reviewMemoryCandidate, showMemoryCandidate, } from '../src/memory/candidates.js';
41
41
  import { installBundledSkills, installGlobalSkill, skillStatus, skillSuiteStatus, uninstallBundledSkills, uninstallGlobalSkill, upgradeBundledSkills, upgradeGlobalSkill, } from '../src/skill-manager.js';
42
- import { agentPlatformReadiness, MANAGED_AGENT_PLATFORMS, multicaTargets, platformSkillForRole, requireSupportedAgentPlatform, resolveAgentPlatform, statusLabel as platformStatusLabel, useAgentPlatform, } from '../src/agent-platform.js';
42
+ import { agentPlatformReadiness, MANAGED_AGENT_PLATFORMS, multicaTargets, platformDocPath, platformSkillForRole, requireSupportedAgentPlatform, resolveAgentPlatform, resolveEndpoint, statusLabel as platformStatusLabel, useAgentPlatform, } from '../src/agent-platform.js';
43
43
  const PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
44
44
  const PACKAGE_JSON = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'));
45
45
  // ROOT = **你的工作区**(当前目录),不是包所在的目录。
@@ -742,14 +742,18 @@ async function main() {
742
742
  if (positionals.length)
743
743
  fail('agent-platform show 不接受位置参数');
744
744
  const out = resolveAgentPlatform(PROJECT_START);
745
- const readiness = out.definition ? agentPlatformReadiness(out.definition.name) : [];
745
+ const readiness = out.definition ? agentPlatformReadiness(out.definition.name, process.env, undefined, PROJECT_START) : [];
746
746
  const targets = out.definition?.name === 'multica-dingtalk' ? multicaTargets() : [];
747
+ const endpoint = out.definition ? resolveEndpoint(out.definition.name, PROJECT_START) : null;
748
+ const doc = out.definition ? platformDocPath(PACKAGE_ROOT, out.definition.name) : null;
747
749
  if (o.json)
748
- console.log(JSON.stringify({ ...out, readiness, targets }, null, 2));
750
+ console.log(JSON.stringify({ ...out, endpoint, readiness, targets, doc }, null, 2));
749
751
  else {
750
752
  printAgentPlatformResolution(out);
753
+ printEndpoint(endpoint);
751
754
  printAgentPlatformReadiness(readiness);
752
755
  printMulticaTargets(targets);
756
+ printPlatformDoc(out.definition?.name);
753
757
  }
754
758
  return;
755
759
  }
@@ -759,10 +763,12 @@ async function main() {
759
763
  const out = useAgentPlatform(PROJECT_START, positionals[0], {
760
764
  packageRoot: PACKAGE_ROOT, installSkills: !o['no-install'],
761
765
  });
762
- const readiness = out.definition ? agentPlatformReadiness(out.definition.name) : [];
766
+ const readiness = out.definition ? agentPlatformReadiness(out.definition.name, process.env, undefined, PROJECT_START) : [];
763
767
  const targets = out.definition?.name === 'multica-dingtalk' ? multicaTargets() : [];
768
+ const endpoint = out.definition ? resolveEndpoint(out.definition.name, PROJECT_START) : null;
769
+ const doc = out.definition ? platformDocPath(PACKAGE_ROOT, out.definition.name) : null;
764
770
  if (o.json)
765
- console.log(JSON.stringify({ ...out, readiness, targets }, null, 2));
771
+ console.log(JSON.stringify({ ...out, endpoint, readiness, targets, doc }, null, 2));
766
772
  else {
767
773
  console.log(`✅ 工作区已归属 ${out.definition?.label}(写入 ${out.written})`);
768
774
  for (const install of out.skillInstalls)
@@ -772,8 +778,10 @@ async function main() {
772
778
  ? ` 已跳过平台技能包安装(--no-install):${out.definition.skills.map((item) => item.name).join(', ')}`
773
779
  : ' 该平台无需额外技能包。');
774
780
  }
781
+ printEndpoint(endpoint);
775
782
  printAgentPlatformReadiness(readiness);
776
783
  printMulticaTargets(targets);
784
+ printPlatformDoc(out.definition?.name);
777
785
  }
778
786
  return;
779
787
  }
@@ -1458,8 +1466,8 @@ function printAgentEnhance(out) {
1458
1466
  function printAgentPlatform(platform) {
1459
1467
  console.log(`${platform.status === 'supported' ? '✅' : '⏳'} ${platform.name} · ${platform.label} · ${platformStatusLabel(platform.status)}`);
1460
1468
  console.log(` ${platform.description}`);
1461
- if (platform.skills.length)
1462
- console.log(` 技能包: ${platform.skills.map((item) => `${item.role}→${item.name}`).join(' · ')}`);
1469
+ for (const skill of platform.skills)
1470
+ console.log(` 技能[${skill.role}] ${skill.name} —— ${skill.purpose}`);
1463
1471
  if (platform.commands.length)
1464
1472
  console.log(` 平台命令: ${platform.commands.map((item) => `dta ${item}`).join(' · ')}`);
1465
1473
  }
@@ -1472,8 +1480,8 @@ function printAgentPlatformResolution(out) {
1472
1480
  const known = out.definition;
1473
1481
  console.log(`${known ? '✅' : '❌'} 当前 platform: ${out.platform}${known ? ` · ${known.label} · ${platformStatusLabel(known.status)}` : '(未知)'}`);
1474
1482
  console.log(` 来源: ${out.source}${out.file ? ` · ${out.file}` : ''}`);
1475
- if (known?.skills.length)
1476
- console.log(` 技能包: ${known.skills.map((item) => `${item.role}→${item.name}`).join(' · ')}`);
1483
+ for (const skill of known?.skills || [])
1484
+ console.log(` 技能[${skill.role}] ${skill.name} —— ${skill.purpose}`);
1477
1485
  }
1478
1486
  // 披露:dta 层平台命令关联到平台内确切的 Skill(诊断信息走 stderr,不污染 --json stdout)。
1479
1487
  function disclosePlatformSkill(resolution, role) {
@@ -1481,6 +1489,30 @@ function disclosePlatformSkill(resolution, role) {
1481
1489
  if (skillName)
1482
1490
  console.error(`提示: 平台 ${resolution.definition.name} 的该命令方法学由 Skill ${skillName} 承载`);
1483
1491
  }
1492
+ function printEndpoint(endpoint) {
1493
+ if (!endpoint)
1494
+ return;
1495
+ if (endpoint.source === 'ambiguous') {
1496
+ console.log(` Endpoint: 多个已登录目标未选定(${endpoint.candidates.join(' / ')})——` +
1497
+ `用 ${endpoint.envVar} 或指定 profile 明确选择`);
1498
+ return;
1499
+ }
1500
+ if (!endpoint.endpoint) {
1501
+ console.log(` Endpoint: 未解析——设 ${endpoint.envVar} 或登录 multica 后生效`);
1502
+ return;
1503
+ }
1504
+ const mark = endpoint.confirmed ? '✅' : '⚠️';
1505
+ const note = endpoint.confirmed ? '' : '(建议/未确认,deploy 前需显式确认是预发还是生产)';
1506
+ console.log(` ${mark} Endpoint: ${endpoint.endpoint} · 来源: ${endpoint.source}${note}`);
1507
+ console.log(` (切换:设 ${endpoint.envVar}=<url>、写 dingtalk-agent.json#multicaEndpoint、或登录对应 profile;无需改代码)`);
1508
+ }
1509
+ function printPlatformDoc(platformName) {
1510
+ if (!platformName)
1511
+ return;
1512
+ const path = platformDocPath(PACKAGE_ROOT, platformName);
1513
+ if (path)
1514
+ console.log(` 平台说明: ${path}\n (切换到该平台后请阅读,了解各技能用途与交付链)`);
1515
+ }
1484
1516
  function printMulticaTargets(targets) {
1485
1517
  if (!targets.length)
1486
1518
  return;