openclaw-openagent 1.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 (113) hide show
  1. package/index.ts +114 -0
  2. package/openclaw.plugin.json +159 -0
  3. package/package.json +79 -0
  4. package/skills/clawlink/SKILL.md +145 -0
  5. package/skills/clawlink/SKILL.md.bak +165 -0
  6. package/src/app/channel-tools.ts +249 -0
  7. package/src/app/discovery-tools.ts +273 -0
  8. package/src/app/hooks.ts +60 -0
  9. package/src/app/index.ts +78 -0
  10. package/src/app/messaging-tools.ts +79 -0
  11. package/src/app/ops-tools.ts +155 -0
  12. package/src/app/remote-agent-tool.ts +476 -0
  13. package/src/app/types.ts +67 -0
  14. package/src/app/verbose-preflight.ts +190 -0
  15. package/src/auth/config.ts +197 -0
  16. package/src/auth/credential-manager.ts +146 -0
  17. package/src/auth/index.ts +24 -0
  18. package/src/auth/verify.ts +99 -0
  19. package/src/channel.ts +565 -0
  20. package/src/compat.ts +82 -0
  21. package/src/config/config-schema.ts +39 -0
  22. package/src/messaging/aggregator.ts +120 -0
  23. package/src/messaging/collector.ts +89 -0
  24. package/src/messaging/executor.ts +72 -0
  25. package/src/messaging/inbound.ts +150 -0
  26. package/src/messaging/index.ts +11 -0
  27. package/src/messaging/mention-protocol.ts +94 -0
  28. package/src/messaging/process-c2c-request.ts +564 -0
  29. package/src/messaging/process-message.ts +373 -0
  30. package/src/messaging/scheduler.ts +55 -0
  31. package/src/messaging/types.ts +38 -0
  32. package/src/plugin-ui/assets/agentbook-icon.svg +5 -0
  33. package/src/plugin-ui/assets/magic.svg +5 -0
  34. package/src/plugin-ui/assets/openagent-override.js +9329 -0
  35. package/src/plugin-ui/build.cjs +175 -0
  36. package/src/plugin-ui/index.ts +18 -0
  37. package/src/plugin-ui/modules/agent-book/panel/agent-book.js +458 -0
  38. package/src/plugin-ui/modules/agent-book/panel/agent-card.js +154 -0
  39. package/src/plugin-ui/modules/agent-book/panel/agent-data.js +644 -0
  40. package/src/plugin-ui/modules/agent-book/panel/inject-ui.js +456 -0
  41. package/src/plugin-ui/modules/agent-book/panel/mention-state.js +206 -0
  42. package/src/plugin-ui/modules/agent-book/panel/styles.js +670 -0
  43. package/src/plugin-ui/modules/agent-book/remote-agent-tool/components-core.js +293 -0
  44. package/src/plugin-ui/modules/agent-book/remote-agent-tool/thought-chain-card.js +208 -0
  45. package/src/plugin-ui/modules/agent-book/scanner.js +119 -0
  46. package/src/plugin-ui/modules/agent-book/travelcard/travel-cards.js +500 -0
  47. package/src/plugin-ui/modules/agent-book/travelcard/travel-engine.js +652 -0
  48. package/src/plugin-ui/modules/agent-book/travelcard/travel-styles.js +251 -0
  49. package/src/plugin-ui/modules/loader/bootstrap.js +38 -0
  50. package/src/plugin-ui/modules/loader/shared-state.js +560 -0
  51. package/src/plugin-ui/modules/loader/ws-intercept.js +199 -0
  52. package/src/plugin-ui/modules/remote-agent/chunk-parser.js +161 -0
  53. package/src/plugin-ui/modules/remote-agent/execution-card.js +269 -0
  54. package/src/plugin-ui/modules/remote-agent/markdown-renderer.js +256 -0
  55. package/src/plugin-ui/modules/remote-agent/native-style-adapter.js +146 -0
  56. package/src/plugin-ui/modules/remote-agent/output-card.js +259 -0
  57. package/src/plugin-ui/modules/remote-agent/progress-store.js +363 -0
  58. package/src/plugin-ui/modules/remote-agent/render-hooks.js +1609 -0
  59. package/src/plugin-ui/modules/remote-agent/styles.js +668 -0
  60. package/src/plugin-ui/modules/remote-agent/tool-card-model.js +56 -0
  61. package/src/plugin-ui/ui-extension-loader/backup.ts +92 -0
  62. package/src/plugin-ui/ui-extension-loader/index.ts +276 -0
  63. package/src/plugin-ui/ui-extension-loader/locator.ts +152 -0
  64. package/src/plugin-ui/ui-extension-loader/manifest.ts +57 -0
  65. package/src/plugin-ui/ui-extension-loader/registry-regex.ts +729 -0
  66. package/src/plugin-ui/ui-extension-loader/removed-extensions.ts +70 -0
  67. package/src/plugin-ui/ui-extension-loader/types.ts +68 -0
  68. package/src/proxy/auth-proxy.ts +356 -0
  69. package/src/runtime/account.ts +572 -0
  70. package/src/runtime/index.ts +7 -0
  71. package/src/runtime/plugin-runtime.ts +94 -0
  72. package/src/runtime/registry.ts +71 -0
  73. package/src/sdk/CLASS_MAP.md +143 -0
  74. package/src/sdk/index.d.ts +126 -0
  75. package/src/sdk/index.js +23990 -0
  76. package/src/sdk/modules/cloud-search-module.js +1117 -0
  77. package/src/sdk/modules/follow-module.js +1069 -0
  78. package/src/sdk/modules/group-module.js +7397 -0
  79. package/src/sdk/modules/relationship-module.js +2269 -0
  80. package/src/sdk/modules/signaling-module.js +1468 -0
  81. package/src/sdk/modules/tim-upload-plugin.js +730 -0
  82. package/src/sdk/node-env/http-request.js +90 -0
  83. package/src/sdk/node-env/index.js +57 -0
  84. package/src/sdk/node-env/storage.js +114 -0
  85. package/src/sdk/package.json +10 -0
  86. package/src/sdk/tsconfig.json +16 -0
  87. package/src/state/pending-invocation-store.ts +43 -0
  88. package/src/state/store.ts +676 -0
  89. package/src/tim/c2c.ts +451 -0
  90. package/src/tim/channels.ts +364 -0
  91. package/src/tim/client.ts +330 -0
  92. package/src/tim/index.ts +18 -0
  93. package/src/tim/messages.ts +166 -0
  94. package/src/tim/sdk-logger-init.ts +50 -0
  95. package/src/tools.ts +10 -0
  96. package/src/transport/factory.ts +95 -0
  97. package/src/transport/oasn/index.ts +17 -0
  98. package/src/transport/oasn/oasn-agent-card.ts +111 -0
  99. package/src/transport/oasn/oasn-discovery.ts +108 -0
  100. package/src/transport/oasn/oasn-files.ts +210 -0
  101. package/src/transport/oasn/oasn-http.ts +483 -0
  102. package/src/transport/oasn/oasn-invocation.ts +527 -0
  103. package/src/transport/oasn/oasn-normalize.ts +159 -0
  104. package/src/transport/oasn/oasn-register.ts +106 -0
  105. package/src/transport/oasn/oasn-transport.ts +341 -0
  106. package/src/transport/oasn/oasn-types.ts +353 -0
  107. package/src/transport/tim/index.ts +8 -0
  108. package/src/transport/tim/tim-transport.ts +515 -0
  109. package/src/transport/types.ts +541 -0
  110. package/src/types/openclaw.d.ts +97 -0
  111. package/src/types/tencentcloud-chat.d.ts +15 -0
  112. package/src/util/http.ts +113 -0
  113. package/src/util/logger.ts +131 -0
@@ -0,0 +1,541 @@
1
+ /**
2
+ * Transport ๆŽฅๅฃๅฎšไน‰ๅฑ‚ โ€”โ€” OASN/TIM ๅŒ่ฝจๆŠฝ่ฑก็š„"้›ถไพ่ต–"ๅŸบ็ก€
3
+ *
4
+ * ่ฎพ่ฎกไพๆฎ๏ผšdocs/specs/2026-06-16-oasn-transport-abstraction-design.md ยง2.1
5
+ *
6
+ * ่ฎพ่ฎกๅŽŸๅˆ™๏ผˆInterface Segregation Principle๏ผ‰๏ผš
7
+ * ๆŠŠๅŽŸๆœฌ"ๅกžๅœจไธ€ไธช AgentTransport ๆŽฅๅฃ้‡Œ"็š„ๆ‰€ๆœ‰่ƒฝๅŠ›ๆ‹†ๆˆ 6 ไธช่ƒฝๅŠ›ๆŽฅๅฃ๏ผŒ
8
+ * ๅ†็”จ TypeScript intersection type ็ป„ๅˆๅ‡บ OasnTransport / TimTransport๏ผŒ
9
+ * ่”ๅˆไธบ AgentTransportใ€‚ไธŠๅฑ‚ไปฃ็ ไพ่ต–ๆœ€ๅฐ่ƒฝๅŠ›้›†ๅณๅฏ๏ผŒไธๅ†้œ€่ฆ
10
+ * `transport.foo?.()` ้˜ฒๅพกๅผ่ฐƒ็”จ โ€”โ€” ็ฑปๅž‹็ณป็ปŸๅœจ็ผ–่ฏ‘ๆœŸๅฐฑไฟ่ฏ่ฐƒ็”จๅˆๆณ•ๆ€งใ€‚
11
+ *
12
+ * ่ƒฝๅŠ› โ†” ๅฎž็Žฐ ็Ÿฉ้˜ต๏ผš
13
+ *
14
+ * ่ƒฝๅŠ›ๆŽฅๅฃ โ”ƒ OasnTransport โ”ƒ TimTransport
15
+ * โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ƒโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ƒโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
16
+ * CoreTransport โ”ƒ โœ“ โ”ƒ โœ“
17
+ * TaskTransport โ”ƒ โœ“ โ”ƒ โœ“
18
+ * DiscoveryTransport โ”ƒ โœ“ โ”ƒ โœ“
19
+ * RegistrationTransportโ”ƒ โœ“ โ”ƒ โœ—
20
+ * FileTransport โ”ƒ โœ“ โ”ƒ โœ—
21
+ * IMChannelTransport โ”ƒ โœ— โ”ƒ โœ“
22
+ */
23
+
24
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
25
+ // ๅ‡ญ่ฏๅฑ‚
26
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
27
+
28
+ /**
29
+ * ้€š็”จไผ ่พ“ๅ‡ญ่ฏใ€‚ไธค็ง transport ๅœจไธๅŒๅญ—ๆฎต่ฏญไน‰ไธ‹ๅค็”จๅŒไธ€็ป“ๆž„ใ€‚
30
+ *
31
+ * ๅญ—ๆฎต โ”ƒ OASN โ”ƒ TIM
32
+ * โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ƒโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ƒโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
33
+ * identity โ”ƒ agent_id (`agt_cli_*`) โ”ƒ userId๏ผˆ= agentId๏ผ‰
34
+ * token โ”ƒ api_key (`oak_*`) Bearer โ”ƒ userSig
35
+ * expiresAt โ”ƒ 0๏ผˆapi_key ไธ่ฟ‡ๆœŸ๏ผ‰ โ”ƒ epoch ms๏ผˆๅซ 5min margin๏ผ‰
36
+ *
37
+ * ๆณจ๏ผšๅฎž็Žฐ็›ธๅ…ณๅธธ้‡๏ผˆapiBase / sdkAppId ็ญ‰๏ผ‰ๅฑžไบŽ"transport ๆž„้€ ๅ‚ๆ•ฐ"๏ผŒ
38
+ * ไธ่ฟ›ๅ…ฅๅ‡ญ่ฏ็ป“ๆž„๏ผŒ้ฟๅ…่ฟ่กŒๆœŸ Record<string, unknown> ็ฑปๅž‹้€ƒ้€ธใ€‚
39
+ */
40
+ export interface TransportCredentials {
41
+ /** OASN: agent_id๏ผ›TIM: userId */
42
+ identity: string;
43
+ /** OASN: api_key (Bearer)๏ผ›TIM: userSig */
44
+ token: string;
45
+ /** ่ฟ‡ๆœŸๆ—ถ้—ดๆˆณ (epoch ms)ใ€‚OASN ้™ๆ€ api_key = 0 */
46
+ expiresAt: number;
47
+ }
48
+
49
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
50
+ // ไปปๅŠก่ฏทๆฑ‚ / ็ป“ๆžœ
51
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
52
+
53
+ /**
54
+ * ๅ‘่ตทไธ€ๆฌก่ฟœ็จ‹ Agent ่ฐƒ็”จ็š„ๅ…ฅๅ‚ใ€‚
55
+ *
56
+ * - OASN ่ทฏๅพ„๏ผšrequestId ไป…ๅšๅฎขๆˆท็ซฏ trace๏ผ›ๆœๅŠก็ซฏ็”จ idempotency_key + invocation_id ๆ ‡่ฏ†่ฐƒ็”จ
57
+ * - TIM ่ทฏๅพ„๏ผšrequestId ็›ดๆŽฅไฝœไธบ C2C ๅ…ณ่” id
58
+ */
59
+ export interface TaskRequest {
60
+ /** ๅฎขๆˆท็ซฏ็”Ÿๆˆ็š„่ฏทๆฑ‚ id๏ผˆไธ็ญ‰ๅŒไบŽ OASN ็š„ invocation_id๏ผ‰ */
61
+ requestId: string;
62
+ /** ไปปๅŠกๆ–‡ๆœฌๅ†…ๅฎน โ€”โ€” LLM ๅทฅๅ…ท็š„ `task` ๅ‚ๆ•ฐ */
63
+ task: string;
64
+ /**
65
+ * ็ปญไผ ๅทฒๆœ‰ session ๆ—ถๅกซๅ…ฅใ€‚
66
+ * - OASN: ็”จไบŽๅœจๅทฒๆœ‰ session ไธŠๅ ๅŠ ๆ–ฐ Invocation
67
+ * - TIM: C2C ๆ—  session ๆฆ‚ๅฟต๏ผŒไผ ๅ…ฅๅณๅฟฝ็•ฅ
68
+ */
69
+ sessionId?: string;
70
+ /** ้™„ไปถๅผ•็”จๅˆ—่กจ๏ผˆOASN file_ref๏ผ›TIM ๅฝ“ๅ‰ไธๆ”ฏๆŒ๏ผŒๅฟฝ็•ฅ๏ผ‰ */
71
+ inputFileRefs?: string[];
72
+ /** Artifact ๅผ•็”จๅˆ—่กจ๏ผˆOASN-only๏ผ‰ */
73
+ inputArtifactRefs?: string[];
74
+ /** OASN Invocation ๆœŸๆœ›ๆ‰ง่กŒ่ถ…ๆ—ถ๏ผ›ๆœๅŠก็ซฏไผš่ฃๅ†ณไธบ effective_timeout_ms */
75
+ timeoutMs?: number;
76
+ }
77
+
78
+ /** ่ฟ›ๅบฆๅ›ž่ฐƒ่ฝฝ่ท */
79
+ export interface TaskProgress {
80
+ requestId: string;
81
+ /**
82
+ * ่ฟ›ๅบฆๆ–‡ๆœฌใ€‚
83
+ * - OASN: progress.safe_status_message
84
+ * - TIM: C2C `openagent_task_progress` ่‡ชๅฎšไน‰ๆถˆๆฏไธญ็š„ content
85
+ */
86
+ content: string;
87
+ }
88
+
89
+ /**
90
+ * Artifact ๅผ•็”จ โ€”โ€” ่ฟœ็จ‹ Agent ่ฟ”ๅ›ž็š„ไบง็‰ฉ๏ผˆๆ–‡ไปถ/ไบŒ่ฟ›ๅˆถ๏ผ‰ใ€‚
91
+ * ไธŠๅฑ‚่‹ฅ้œ€่ฆๅ†…ๅฎน๏ผŒๅฟ…้กปๅ†ๆฌก่ฐƒ็”จ `FileTransport.downloadArtifact()` ๆ‹‰ๅ–ใ€‚
92
+ */
93
+ export interface ArtifactRef {
94
+ id: string;
95
+ displayName: string;
96
+ mimeType: string;
97
+ sizeBytes: number;
98
+ /** ๆœๅŠก็ซฏๆ˜ฏๅฆๅทฒๅฐฑ็ปชๅฏไธ‹่ฝฝใ€‚OASN ๆฅ่‡ช artifacts[].content_available */
99
+ contentAvailable: boolean;
100
+ /**
101
+ * ๅ†…ๅฎนๆ‹‰ๅ–ๅœฐๅ€ใ€‚
102
+ * - OASN: `${apiBase}/api/artifacts/{id}/content`๏ผˆ้œ€ Bearer api_key๏ผ‰
103
+ * - TIM: TIM ๆœๅŠกไธ‹่ฝฝ URL๏ผˆfetch ๅณๅพ—๏ผ‰
104
+ */
105
+ contentUrl: string;
106
+ }
107
+
108
+ /** ไปปๅŠก็ป“ๆžœ */
109
+ export interface TaskResult {
110
+ requestId: string;
111
+ status: 'complete' | 'error';
112
+ /**
113
+ * ๆ–‡ๆœฌ็ป“ๆžœใ€‚
114
+ * - OASN: inline_result.summary
115
+ * - TIM: C2C `openagent_task_result.content`
116
+ */
117
+ content: string;
118
+ /** ไบง็‰ฉๅˆ—่กจใ€‚ๅฏ่ƒฝไธบ็ฉบ */
119
+ artifacts?: ArtifactRef[];
120
+ }
121
+
122
+ /**
123
+ * `sendTask` ่ฟ”ๅ›žๅ€ผใ€‚ๆบๅธฆๅฏ่ง‚ๅฏŸๆ€ง id๏ผŒไพฟไบŽไธŠๅฑ‚ trace + idempotency ็ปญ่ฝฎ่ฏขใ€‚
124
+ *
125
+ * - OASN: ๅซ invocation_id / session_id / effective_timeout_ms
126
+ * - TIM: invocationId = requestId๏ผˆC2C ๆ— ็‹ฌ็ซ‹ invocation๏ผ‰๏ผ›ๅ…ถไป–ๅญ—ๆฎต undefined
127
+ */
128
+ export interface TaskHandle {
129
+ /** OASN: invocation_id๏ผ›TIM: requestId */
130
+ invocationId: string;
131
+ /** OASN: session_id๏ผ›TIM: undefined */
132
+ sessionId?: string;
133
+ /** ๆœๅŠก็ซฏ่ฃๅ†ณๅŽ็š„ๅฎž้™…่ถ…ๆ—ถ๏ผˆOASN: effective_timeout_ms๏ผ‰ */
134
+ effectiveTimeoutMs?: number;
135
+ /** ๆœๅŠก็ซฏ้ฆ–่ฝฎๅปบ่ฎฎ่ฝฎ่ฏข้—ด้š”๏ผˆOASN: next_poll_after_ms๏ผ‰ */
136
+ nextPollAfterMs?: number;
137
+ }
138
+
139
+ /** ่ฟ›ๅบฆๅ›ž่ฐƒ็ญพๅ */
140
+ export type ProgressCallback = (progress: TaskProgress) => void;
141
+
142
+ /** ่ขซ่ฐƒ็ซฏไปปๅŠกๅค„็†ๅ™จ็ญพๅ๏ผˆOASN ไธไผš่งฆๅ‘๏ผŒไป… TIM ็š„ T3 ่ทฏๅพ„ไฝฟ็”จ๏ผ‰ */
143
+ export type TaskHandler = (request: TaskRequest & { from: string }) => Promise<TaskResult>;
144
+
145
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
146
+ // ้”™่ฏฏ็ฑปๅž‹
147
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
148
+
149
+ /**
150
+ * ไผ ่พ“ๅฑ‚็ปŸไธ€้”™่ฏฏใ€‚HTTP ้”™่ฏฏ / SDK ้”™่ฏฏ้ƒฝๅœจ transport ๅ†…้ƒจ่ฝฌๆขไธบๆญค็ฑปๅž‹ใ€‚
151
+ *
152
+ * - OASN ๆฅๆบ๏ผšๅ“ๅบ”ไฝ“ `error.{ code, message, retryable, details, request_id }`
153
+ * - TIM ๆฅๆบ๏ผšSDK ้”™่ฏฏ code๏ผˆKICKED_OUT / NETWORK_TIMEOUT / ...๏ผ‰
154
+ */
155
+ export interface TransportError extends Error {
156
+ /** ๅŽŸๅง‹้”™่ฏฏ็  */
157
+ code: string;
158
+ /** ๆ˜ฏๅฆๅฏ้‡่ฏ•๏ผˆOASN ๆœๅŠก็ซฏ่ฃๅ†ณ๏ผŒTIM ็”ฑๆœฌๅœฐๅˆคๆ–ญ๏ผ‰ */
159
+ retryable: boolean;
160
+ /** OASN: error.request_id๏ผ›TIM: SDK request id๏ผˆ่‹ฅๆœ‰๏ผ‰ */
161
+ requestId?: string;
162
+ /** ๅ…ณ่” invocation/session๏ผˆๅฆ‚ๆœ‰๏ผ‰ */
163
+ invocationId?: string;
164
+ sessionId?: string;
165
+ }
166
+
167
+ /**
168
+ * ๆž„้€  TransportError ็š„ๅทฅๅŽ‚ใ€‚ๅ„ transport ๅฎž็Žฐๅ†…้ƒจ่ฐƒ็”จใ€‚
169
+ * ๆญคๅค„ๆ˜พๅผๅฃฐๆ˜Žไธบ function ่€Œ้ž class๏ผŒๅ› ไธบ TransportError ๆ˜ฏๆŽฅๅฃ่€Œ้žๅ…ทไฝ“็ฑปๅž‹ใ€‚
170
+ */
171
+ export function makeTransportError(
172
+ code: string,
173
+ message: string,
174
+ opts: { retryable?: boolean; requestId?: string; invocationId?: string; sessionId?: string } = {},
175
+ ): TransportError {
176
+ const err = new Error(message) as TransportError;
177
+ err.code = code;
178
+ err.retryable = opts.retryable ?? false;
179
+ if (opts.requestId) err.requestId = opts.requestId;
180
+ if (opts.invocationId) err.invocationId = opts.invocationId;
181
+ if (opts.sessionId) err.sessionId = opts.sessionId;
182
+ return err;
183
+ }
184
+
185
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
186
+ // Agent ๅ‘็Žฐ โ€”โ€” AgentCard / ๆœ็ดข
187
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
188
+
189
+ /**
190
+ * OASN AgentCard ๅ…ฌๅผ€่ง†ๅ›พใ€‚
191
+ * ไธŽ OASN apis.md `GET /api/agent-cards/{agent_id}` ๅ“ๅบ”ๅญ—ๆฎตไธ€ไธ€ๅฏน้ฝใ€‚
192
+ */
193
+ export interface AgentCard {
194
+ agent_id: string;
195
+ agent_type: 'client' | 'service';
196
+ name: string;
197
+ description: string | null;
198
+ /** Model Operation Manual โ€”โ€” ไฝฟ็”จ่ฏดๆ˜Ž๏ผˆMarkdown๏ผ‰ */
199
+ MOM: string | null;
200
+ tags: Array<{ tag_id: string; name: string }>;
201
+ category: string[];
202
+ avatar_url: string | null;
203
+ visibility?: 'public' | 'private';
204
+ }
205
+
206
+ /** ๆœ็ดข่ฏทๆฑ‚ใ€‚ไธ‰็งๆœ็ดขๆจกๅผ๏ผˆby-query / by-category / by-tags๏ผ‰ๅ…ฑ็”จๅŒไธ€็ป“ๆž„๏ผŒ็”ฑ้ž็ฉบๅญ—ๆฎตๅˆคๅฎš่ตฐๅ“ชไธช็ซฏ็‚น */
207
+ export interface SearchQuery {
208
+ /** ่‡ช็„ถ่ฏญ่จ€๏ผˆ`by-query`๏ผ‰ */
209
+ query?: string;
210
+ /** category id ๆ•ฐ็ป„๏ผˆ`by-category`๏ผ‰ */
211
+ category?: string[];
212
+ /** tag id ๆ•ฐ็ป„๏ผˆ`by-tags`๏ผ‰ */
213
+ tags?: string[];
214
+ /** ้ป˜่ฎค `["service"]`ใ€‚ๅฝ“ๅ‰ OASN search ๅชๆ”ฏๆŒ service */
215
+ agentTypes?: string[];
216
+ sort?: Array<'relevance' | 'usage' | 'recency'>;
217
+ pageSize?: number;
218
+ pageNum?: number;
219
+ }
220
+
221
+ export interface SearchResult {
222
+ searchId: string;
223
+ agentCards: AgentCard[];
224
+ pageNum: number;
225
+ pageSize: number;
226
+ hasNext: boolean;
227
+ }
228
+
229
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
230
+ // ๆณจๅ†Œ / ่ฎค้ข† / Owner๏ผˆOASN-only๏ผ‰
231
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
232
+
233
+ /** `POST /api/agents/register` ๅ“ๅบ” */
234
+ export interface RegisterResult {
235
+ agent_id: string;
236
+ agent_type: 'client';
237
+ /** ไธ€ๆฌกๆ€งๆ˜Žๆ–‡ api_key โ€”โ€” ๆŒไน…ๅŒ–ๅŽๅฟ…้กป็ซ‹ๅณไปŽๅ†…ๅญ˜ๆธ…็† */
238
+ api_key: string;
239
+ claim_url: string;
240
+ status: 'unclaimed';
241
+ agent_card: AgentCard;
242
+ }
243
+
244
+ /** `POST /api/agents/claim` ่ฏทๆฑ‚ */
245
+ export interface ClaimParams {
246
+ agent_id?: string;
247
+ /** ๆฅ่‡ช claim_url ๆœซๆฎต๏ผˆไธŽ agent_id+api_key ไบŒ้€‰ไธ€๏ผ‰ */
248
+ claim_token?: string;
249
+ owner_email: string;
250
+ }
251
+
252
+ export interface ClaimResult {
253
+ agent_id: string;
254
+ status: 'claim_email_sent';
255
+ owner_email_masked: string;
256
+ /** ้‚ฎไปถ้ชŒ่ฏ้“พๆŽฅ่ฟ‡ๆœŸๆ—ถ้—ด๏ผˆISO 8601 ๅญ—็ฌฆไธฒ๏ผ‰ */
257
+ expires_at: string;
258
+ }
259
+
260
+ /** `GET /api/agents/{agent_id}` ๅ“ๅบ” */
261
+ export interface AgentStatusResult {
262
+ agent_id: string;
263
+ status: 'unclaimed' | 'claim_pending' | 'claimed';
264
+ /** CA/ClientAgent access token, not Owner token. Runtime-only. */
265
+ access_token?: string;
266
+ }
267
+
268
+ /** `PATCH /api/agent-cards/{agent_id}` ่ฏทๆฑ‚ใ€‚PATCH ่ฏญไน‰๏ผš็œ็•ฅ=ไธๅ˜๏ผŒๆ˜พๅผ null=ๆธ…็ฉบ */
269
+ export interface AgentCardPatch {
270
+ name?: string | null;
271
+ description?: string | null;
272
+ MOM?: string | null;
273
+ tags?: string[] | null;
274
+ category?: string[] | null;
275
+ avatar_ref?: string | null;
276
+ visibility?: 'public' | 'private';
277
+ public_metadata?: Record<string, unknown> | null;
278
+ }
279
+
280
+ /** Category ๆ ‘่Š‚็‚น */
281
+ export interface CategoryNode {
282
+ category_id: string;
283
+ name: string;
284
+ children?: CategoryNode[];
285
+ }
286
+
287
+ export interface CategoryTree {
288
+ categories: CategoryNode[];
289
+ updated_at: string;
290
+ }
291
+
292
+ /** `GET /api/users/me` ๅ“ๅบ”๏ผˆOwner ็ปดๅบฆ๏ผŒๆ’ไปถๅฝ“ๅ‰ไธป่ฆ่ตฐ Agent api_key๏ผ‰ */
293
+ export interface OwnerInfo {
294
+ owner_id: string;
295
+ owner_type: string;
296
+ display_name: string;
297
+ email_masked: string;
298
+ email_verified_at?: string;
299
+ status: string;
300
+ }
301
+
302
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
303
+ // ๆ–‡ไปถ / Artifact๏ผˆOASN-only๏ผ‰
304
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
305
+
306
+ /** `POST /api/files` ่พ“ๅ…ฅๅ‚ๆ•ฐ */
307
+ export interface UploadFileParams {
308
+ /** ๆ–‡ไปถๅ†…ๅฎน๏ผˆๆต่งˆๅ™จ Blob ๆˆ– Node Buffer๏ผ‰ */
309
+ content: Blob | Buffer;
310
+ /** ๅฑ•็คบๅ๏ผˆๅซๅŽ็ผ€๏ผ‰ */
311
+ displayName: string;
312
+ /** ็”จ้€”ๆ ‡็ญพ๏ผšinput / reference / ... */
313
+ purpose?: string;
314
+ /** ๆœŸๆœ›ๅฏๅผ•็”จๆ—ถ้•ฟ๏ผˆ็ง’๏ผ‰๏ผŒๆœๅŠก็ซฏๆœ€็ปˆ่ฃๅ†ณ */
315
+ expiresInSeconds?: number;
316
+ /** MIME ็ฑปๅž‹๏ผˆๅฏ้€‰๏ผŒๆœชไผ ๆ—ถๆœๅŠก็ซฏๆŽจๆ–ญ๏ผ‰ */
317
+ mimeType?: string;
318
+ }
319
+
320
+ /** `POST /api/files` ๅ“ๅบ” */
321
+ export interface UploadFileResult {
322
+ /** ๅŽ็ปญ Invocation ็š„ input_file_refs ไฝฟ็”จ */
323
+ fileRef: string;
324
+ displayName: string;
325
+ mimeType: string;
326
+ sizeBytes: number;
327
+ /** epoch ms */
328
+ expiresAt: number;
329
+ }
330
+
331
+ /** Artifact ไธ‹่ฝฝ็ป“ๆžœ */
332
+ export interface DownloadArtifactResult {
333
+ content: ArrayBuffer;
334
+ mimeType: string;
335
+ displayName: string;
336
+ }
337
+
338
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
339
+ // IM ้ข‘้“๏ผˆTIM-only๏ผŒๅคšๆ•ฐๅฝ“ๅ‰ DORMANT๏ผ‰
340
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
341
+
342
+ export interface ChannelInfo {
343
+ id: string;
344
+ name: string;
345
+ desc: string;
346
+ memberCount?: number;
347
+ }
348
+
349
+ export interface MemberInfo {
350
+ id: string;
351
+ nick: string;
352
+ role: string;
353
+ avatar?: string;
354
+ }
355
+
356
+ /** ็พค่Šๆ–‡ๆœฌๆถˆๆฏ๏ผˆTIM-only๏ผ‰ */
357
+ export interface TransportMessage {
358
+ id: string;
359
+ channelId: string;
360
+ from: string;
361
+ nick: string;
362
+ text: string;
363
+ /** epoch ms๏ผˆๆณจ๏ผšTIM ๅŽŸๅง‹ไธบ็ง’๏ผŒ่ฝฌๆข็”ฑ transport ๅฑ‚ๅฎŒๆˆ๏ผ‰ */
364
+ time: number;
365
+ mentionsMe: boolean;
366
+ }
367
+
368
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
369
+ // ไบ‹ไปถ็ฑปๅž‹
370
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
371
+
372
+ /** ไธค็ง transport ้ƒฝไผš่งฆๅ‘็š„ๆ ธๅฟƒไบ‹ไปถ */
373
+ export type CoreTransportEvent =
374
+ /** ๅ‡ญ่ฏๅคฑๆ•ˆใ€‚OASN: 401 UNAUTHENTICATED๏ผ›TIM: KICKED_OUT */
375
+ | 'credential_expired'
376
+ /** ้‡่ฟžๆˆๅŠŸ๏ผˆTIM ๆœ‰ๆ„ไน‰๏ผ›OASN ้€šๅธธไธ่งฆๅ‘๏ผ‰ */
377
+ | 'reconnected'
378
+ /** ่ฟžๆŽฅๆ–ญๅผ€๏ผˆTIM ๆœ‰ๆ„ไน‰๏ผ›OASN ้€šๅธธไธ่งฆๅ‘๏ผ‰ */
379
+ | 'disconnected';
380
+
381
+ /** ไป… TIM transport ไผš่งฆๅ‘็š„ไบ‹ไปถ */
382
+ export type TimOnlyTransportEvent =
383
+ /** ็พค่Šๆถˆๆฏๅˆฐ่พพ */
384
+ | 'message'
385
+ /** ๆ”ถๅˆฐ่ฟœ็จ‹ agent ็š„ C2C ไปปๅŠก่ฏทๆฑ‚๏ผˆT3 ่ทฏๅพ„๏ผ‰ */
386
+ | 'task_received'
387
+ /** ไปปๅŠก่ฟ›ๅบฆๆŽจ้€๏ผˆC2C ๆŽฅๆ”ถๆ–น๏ผ‰ */
388
+ | 'task_progress';
389
+
390
+ export type TransportEvent = CoreTransportEvent | TimOnlyTransportEvent;
391
+
392
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
393
+ // ่ƒฝๅŠ›ๆŽฅๅฃ
394
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
395
+
396
+ /**
397
+ * ๆ ธๅฟƒ็”Ÿๅ‘ฝๅ‘จๆœŸ โ€”โ€” ไธค็ง transport ้ƒฝๅฎž็Žฐใ€‚
398
+ *
399
+ * `ready / isReady` ่ฏญไน‰็ปŸไธ€ไธบ"ๅ‡ญ่ฏๅทฒๆ ก้ชŒ๏ผŒๅฏๅทฅไฝœ"๏ผš
400
+ * - OASN: api_key ้€š่ฟ‡ GET /api/agent-cards/{agent_id} ้ชŒ่ฏ
401
+ * - TIM: WS ๅทฒ login ไธ” SDK_READY
402
+ */
403
+ export interface CoreTransport {
404
+ /** ๅฎžไพ‹ id๏ผˆๅคš่ดฆๆˆทๆ”ฏๆŒๆ—ถ็”จไฝœ key๏ผ‰ */
405
+ readonly id: string;
406
+ readonly transportType: 'oasn' | 'tim';
407
+
408
+ /** ๆ ก้ชŒๅ‡ญ่ฏๅนถ่ฟ›ๅ…ฅๅฏๅทฅไฝœ็Šถๆ€ */
409
+ ready(credentials: TransportCredentials): Promise<void>;
410
+
411
+ /** ้‡Šๆ”พ่ต„ๆบ๏ผˆOASN: ๆธ…่ฝฎ่ฏข timer๏ผ›TIM: WS logout๏ผ‰ */
412
+ dispose(): Promise<void>;
413
+
414
+ /** ๆ˜ฏๅฆๅค„ไบŽๅฏๅทฅไฝœ็Šถๆ€ */
415
+ readonly isReady: boolean;
416
+
417
+ on(event: CoreTransportEvent, handler: (...args: any[]) => void): void;
418
+ off(event: CoreTransportEvent, handler: (...args: any[]) => void): void;
419
+ }
420
+
421
+ /**
422
+ * ไปปๅŠก่ฐƒ็”จ๏ผˆT2 ไธป่ทฏๅพ„๏ผ‰โ€”โ€” ไธค็ง transport ้ƒฝๅฎž็Žฐใ€‚
423
+ *
424
+ * ๆณจๆ„๏ผš่ฟ”ๅ›ž็š„ `TaskHandle` ็”ฑ่ฐƒ็”จๆ–นๆŒๆœ‰ๅนถไผ ็ป™ `waitForTaskResult`ใ€‚
425
+ * ไธŠๅฑ‚ไธ่ฆๅ‡่ฎพๅฎƒๆ˜ฏ็ฎ€ๅ•็š„ string id โ€”โ€” OASN ้œ€่ฆ invocation_id + session_id ่”ๅŠจใ€‚
426
+ */
427
+ export interface TaskTransport {
428
+ /** ๅ‘่ตท่ฟœ็จ‹่ฐƒ็”จ */
429
+ sendTask(targetAgentId: string, task: TaskRequest): Promise<TaskHandle>;
430
+
431
+ /**
432
+ * ็ญ‰ๅพ…ไปปๅŠก็ป“ๆžœใ€‚
433
+ * - OASN: ่ฝฎ่ฏข๏ผˆๆˆ– SSE ๅ‡็บง๏ผŒ่ง่ฎพ่ฎกๆ–‡ๆกฃ ยง11.8๏ผ‰
434
+ * - TIM: ้˜ปๅกž็ญ‰ๅพ… C2C `openagent_task_result` ๆถˆๆฏ
435
+ *
436
+ * ่ถ…ๆ—ถ็”ฑ `options.timeoutMs` ๆŽงๅˆถ๏ผˆOASN ไธŽ effective_timeout_ms ๅ่ฐƒ๏ผŒ่ง ยง11.3๏ผ‰ใ€‚
437
+ */
438
+ waitForTaskResult(
439
+ handle: TaskHandle,
440
+ options: { timeoutMs: number; signal?: AbortSignal; onProgress?: ProgressCallback },
441
+ ): Promise<TaskResult>;
442
+ }
443
+
444
+ /** Agent ๅ‘็Žฐ โ€”โ€” ไธค็ง transport ้ƒฝๅฎž็Žฐ๏ผˆTIM ๆŠŠ channel ๅˆ—่กจไผช่ฃ…ๆˆ AgentCard๏ผ‰ */
445
+ export interface DiscoveryTransport {
446
+ searchAgents(query: SearchQuery): Promise<SearchResult>;
447
+ getAgent(agentId: string): Promise<AgentCard | null>;
448
+ /** Category ๆ ‘๏ผˆOASN-only๏ผ›TIM ๅฎž็Žฐๅฏ่ฟ”ๅ›ž็ฉบๆ ‘๏ผ‰ */
449
+ getCategories?(params?: { agentType?: string }): Promise<CategoryTree>;
450
+ }
451
+
452
+ /** Agent ๆณจๅ†ŒไธŽ็ฎก็† โ€”โ€” OASN-only */
453
+ export interface RegistrationTransport {
454
+ /** `POST /api/agents/register`ใ€‚install_id ็”ฑ ยง11.7 ้˜ฒๅญคๅ„ฟๆœบๅˆถๆไพ› */
455
+ registerAgent(
456
+ platform: string,
457
+ params?: { installId?: string; deviceHint?: string },
458
+ ): Promise<RegisterResult>;
459
+ claimAgent(params: ClaimParams): Promise<ClaimResult>;
460
+ getAgentStatus(agentId: string): Promise<AgentStatusResult>;
461
+ updateAgentCard(agentId: string, patch: AgentCardPatch): Promise<AgentCard>;
462
+ getCurrentOwner?(): Promise<OwnerInfo | null>;
463
+ }
464
+
465
+ /** ๆ–‡ไปถ / Artifact โ€”โ€” OASN-only */
466
+ export interface FileTransport {
467
+ /** ไธŠไผ ๆ–‡ไปถ๏ผŒ่ฟ”ๅ›ž file_ref๏ผˆๅซ LRU ็ผ“ๅญ˜๏ผŒ่ง่ฎพ่ฎกๆ–‡ๆกฃ ยง11.4๏ผ‰ */
468
+ uploadFile(file: UploadFileParams): Promise<UploadFileResult>;
469
+ /** ไธ‹่ฝฝ Artifact ไบŒ่ฟ›ๅˆถๅ†…ๅฎน */
470
+ downloadArtifact(artifactId: string): Promise<DownloadArtifactResult>;
471
+ }
472
+
473
+ /** IM ็พค่ŠไธŽ้ข‘้“็ฎก็† โ€”โ€” TIM-only */
474
+ export interface IMChannelTransport {
475
+ /** TIM-only ไบ‹ไปถ่ฎข้˜… */
476
+ on(event: TimOnlyTransportEvent, handler: (...args: any[]) => void): void;
477
+ off(event: TimOnlyTransportEvent, handler: (...args: any[]) => void): void;
478
+
479
+ /**
480
+ * ๆŽฅๆ”ถ่ฟœ็จ‹ agent ไปปๅŠก๏ผˆT3 ่ทฏๅพ„๏ผ‰ใ€‚
481
+ * OASN ๆ— ๆญค่ƒฝๅŠ› โ€”โ€” ClientAgent ๆ˜ฏๆถˆ่ดน่€…ไพง๏ผŒไธๆŽฅๆ”ถๅค–ๆฅ Invocationใ€‚
482
+ */
483
+ onTaskReceived(handler: TaskHandler): void;
484
+
485
+ /** ็พค่Šๅ‘ๆ–‡ๆœฌ๏ผˆๆ”ฏๆŒ @ ๏ผ‰ */
486
+ sendGroupMessage(
487
+ channelId: string,
488
+ text: string,
489
+ atUserList?: string[],
490
+ ): Promise<{ ok: boolean; messageId: string }>;
491
+
492
+ /** ๆ‹‰ๅ–็พคๅކๅฒ */
493
+ fetchGroupHistory(channelId: string, count?: number): Promise<TransportMessage[]>;
494
+
495
+ // ไปฅไธ‹ๆ–นๆณ•ๅœจๅฝ“ๅ‰ไธšๅŠก้‡Œ DORMANT โ€”โ€” ๆŽฅๅฃไฟ็•™ไธบ optional๏ผŒ่ฟ่กŒๆ—ถไธๆฟ€ๆดป
496
+ listChannels?(): Promise<ChannelInfo[]>;
497
+ searchChannels?(keyword: string): Promise<ChannelInfo[]>;
498
+ joinChannel?(channelId: string): Promise<{ success: boolean; message: string }>;
499
+ leaveChannel?(channelId: string): Promise<{ success: boolean; message: string }>;
500
+ getMembers?(channelId: string): Promise<MemberInfo[]>;
501
+ createChannel?(name: string, desc?: string): Promise<{ success: boolean; channelId: string }>;
502
+ getChannelSkill?(channelId: string): Promise<string | null>;
503
+ setChannelSkill?(channelId: string, skill: string): Promise<{ success: boolean }>;
504
+ }
505
+
506
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
507
+ // ๅฎž็Žฐไพง่šๅˆ็ฑปๅž‹
508
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
509
+
510
+ /**
511
+ * OASN transport ็š„ๅฎž้™…่ƒฝๅŠ›้›†ๅˆ โ€”โ€”
512
+ * ๅซๆ ธๅฟƒ็”Ÿๅ‘ฝๅ‘จๆœŸ + ไปปๅŠก่ฐƒ็”จ + ๅ‘็Žฐ + ๆณจๅ†Œ/่ฎค้ข† + ๆ–‡ไปถ๏ผŒไธๅซ IM ็พค่Šใ€‚
513
+ */
514
+ export type OasnTransport =
515
+ & CoreTransport
516
+ & TaskTransport
517
+ & DiscoveryTransport
518
+ & RegistrationTransport
519
+ & FileTransport;
520
+
521
+ /**
522
+ * TIM transport ็š„ๅฎž้™…่ƒฝๅŠ›้›†ๅˆ โ€”โ€”
523
+ * ๅซๆ ธๅฟƒ็”Ÿๅ‘ฝๅ‘จๆœŸ + ไปปๅŠก่ฐƒ็”จ + ๅ‘็Žฐ + IM ็พค่Š๏ผŒไธๅซ OASN ๆณจๅ†Œ/ๆ–‡ไปถใ€‚
524
+ */
525
+ export type TimTransport =
526
+ & CoreTransport
527
+ & TaskTransport
528
+ & DiscoveryTransport
529
+ & IMChannelTransport;
530
+
531
+ /**
532
+ * ไธŠๅฑ‚่ฐƒ็”จๆ–นๆŒๆœ‰็š„่”ๅˆ็ฑปๅž‹ใ€‚
533
+ *
534
+ * ไฝฟ็”จ่ง„่Œƒ๏ผš
535
+ * - ๅช็”จ Core/Task/Discovery ่ƒฝๅŠ› โ†’ ็›ดๆŽฅๆŽฅๆ”ถ AgentTransport
536
+ * - ้œ€่ฆ OASN-only ่ƒฝๅŠ›๏ผˆๆณจๅ†Œ/ๆ–‡ไปถ๏ผ‰โ†’ ้€š่ฟ‡ `transport.transportType === 'oasn'` narrow
537
+ * - ้œ€่ฆ TIM-only ่ƒฝๅŠ›๏ผˆ็พค่Š/T3๏ผ‰โ†’ ้€š่ฟ‡ `transport.transportType === 'tim'` narrow
538
+ *
539
+ * ไธ่ฆไฝฟ็”จ `transport.foo?.()` ้˜ฒๅพกๅผ่ฐƒ็”จ โ€”โ€” ็”จ transportType ๅœจ็ผ–่ฏ‘ๆœŸ narrowใ€‚
540
+ */
541
+ export type AgentTransport = OasnTransport | TimTransport;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Minimal type declarations for openclaw peer dependency.
3
+ * Only declares the APIs actually used by this plugin.
4
+ *
5
+ * These stubs allow `tsc --noEmit` to pass in environments where
6
+ * openclaw is not installed (e.g. npm pack / CI).
7
+ * At runtime, the real openclaw package provides the implementations.
8
+ */
9
+
10
+ declare module 'openclaw/plugin-sdk/infra-runtime' {
11
+ export function resolvePreferredOpenClawTmpDir(): string;
12
+ }
13
+
14
+ declare module 'openclaw/plugin-sdk/plugin-entry' {
15
+ export interface OpenClawPluginApi {
16
+ runtime?: import('openclaw/plugin-sdk/core').PluginRuntime;
17
+ registerChannel(opts: { plugin: unknown }): void;
18
+ registerTool(factory: unknown, opts?: { optional?: boolean }): void;
19
+ registerHook?(hook: unknown): void;
20
+ registerHttpRoute(params: {
21
+ path: string;
22
+ auth: 'gateway' | 'plugin';
23
+ match?: 'exact' | 'prefix';
24
+ replaceExisting?: boolean;
25
+ handler: (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => Promise<boolean> | boolean;
26
+ }): void;
27
+ registrationMode?: string;
28
+ }
29
+ }
30
+
31
+ declare module 'openclaw/plugin-sdk/channel-config-schema' {
32
+ export function buildChannelConfigSchema(schema: unknown): unknown;
33
+ }
34
+
35
+ declare module 'openclaw/plugin-sdk/core' {
36
+ export interface PluginRuntime {
37
+ version?: string;
38
+ channel: {
39
+ routing: {
40
+ resolveAgentRoute(params: {
41
+ cfg: unknown;
42
+ channel: string;
43
+ accountId: string;
44
+ peer: { kind: string; id: string };
45
+ }): {
46
+ agentId?: string;
47
+ sessionKey?: string;
48
+ mainSessionKey?: string;
49
+ };
50
+ };
51
+ reply: {
52
+ finalizeInboundContext(ctx: unknown): unknown;
53
+ createReplyDispatcherWithTyping(opts: {
54
+ deliver: (
55
+ payload: { text?: string; mediaUrl?: string; mediaUrls?: string[] },
56
+ meta?: { kind?: string },
57
+ ) => Promise<void>;
58
+ onError?: (err: unknown, info: { kind: string }) => void;
59
+ }): {
60
+ dispatcher: unknown;
61
+ replyOptions: Record<string, unknown>;
62
+ markDispatchIdle: () => void;
63
+ };
64
+ withReplyDispatcher(opts: { dispatcher: unknown; run: () => Promise<void> }): Promise<void>;
65
+ dispatchReplyFromConfig(opts: {
66
+ ctx: unknown;
67
+ cfg: unknown;
68
+ dispatcher: unknown;
69
+ replyOptions?: Record<string, unknown>;
70
+ }): Promise<void>;
71
+ };
72
+ session: {
73
+ resolveStorePath(store: unknown, opts: { agentId: string }): string;
74
+ recordInboundSession(opts: {
75
+ storePath: string;
76
+ sessionKey?: string;
77
+ ctx: unknown;
78
+ updateLastRoute?: {
79
+ sessionKey?: string;
80
+ channel: string;
81
+ to: string;
82
+ accountId: string;
83
+ };
84
+ onRecordError?: (err: unknown) => void;
85
+ }): Promise<void>;
86
+ };
87
+ };
88
+ events: {
89
+ onAgentEvent(listener: (evt: {
90
+ sessionKey?: string;
91
+ stream?: string;
92
+ data: { phase?: string; partialResult?: unknown; [key: string]: unknown };
93
+ [key: string]: unknown;
94
+ }) => void): () => void;
95
+ };
96
+ }
97
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Type declarations for local SDK modules
3
+ *
4
+ * These are JS-only modules bundled in src/sdk/ that need
5
+ * minimal type stubs for TypeScript compilation.
6
+ */
7
+
8
+ declare module '../sdk/modules/group-module.js' {
9
+ const GroupModule: unknown;
10
+ export default GroupModule;
11
+ }
12
+
13
+ declare module '../sdk/node-env/index.js' {
14
+ // Side-effect only module โ€” installs ws WebSocket, localStorage, rejection handler
15
+ }