@coralai/sps-plugin-api 0.6.0 → 0.7.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 (2) hide show
  1. package/dist/index.d.ts +58 -8
  2. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -103,7 +103,19 @@ export interface SpsSystemPrompt {
103
103
  * `mode:'async'` 的甚至返回后任务仍在跑(由 join 卡等终态)。
104
104
  * 要做"生成一批图"这种事,选能力,别选工具。
105
105
  */
106
- export interface SpsCapability {
106
+ export type SpsAsyncPoll = {
107
+ done: false;
108
+ } | {
109
+ done: true;
110
+ ok: true;
111
+ result: Record<string, unknown>;
112
+ } | {
113
+ done: true;
114
+ ok: false;
115
+ error: string;
116
+ };
117
+ /** 两种能力共有的那部分。 */
118
+ export interface SpsCapabilityBase {
107
119
  /** 能力 id,卡片用它引用。命名 `<域>.<动作>`,如 `art.chromaKey`。 */
108
120
  id: string;
109
121
  mode: 'sync' | 'async';
@@ -131,14 +143,52 @@ export interface SpsCapability {
131
143
  };
132
144
  /** 一句话说明,给编排页展示。 */
133
145
  summary: string;
134
- /** 执行体。`async` 能力返回后**任务仍在跑**。 */
135
- run(input: unknown, ctx: {
136
- /** 项目在共享树下的相对路径(`t<租户>/<产品>/<项目>`)。 */
137
- project: string;
138
- /** 项目工作区绝对路径。**能力不从卡片收路径**,只从这里取根。 */
139
- projectDir: string;
140
- }): Promise<Record<string, unknown>>;
146
+ /**
147
+ * 这个能力失败时,**这张卡怎么处置**。缺省 `'block'`。
148
+ * ```
149
+ * block 留在原地打 NEEDS-FIX —— 波次屏障挡住后面所有卡,图上看得见它卡住了
150
+ * skip 标 Canceled ⇒ 屏障**放行**,后续卡照跑(留痕写进卡片 meta)
151
+ * ```
152
+ * 🔴 声明式,不是"能力自己去改卡片状态" —— 后者会让卡片有两个写入方。
153
+ * ⚠️ `'skip'` 给"部分失败是常态"的工序用;scaffold/package 这种别用。
154
+ */
155
+ onFailure?: 'block' | 'skip';
156
+ }
157
+ export interface SpsCapabilityCtx {
158
+ /** 项目在共享树下的相对路径(`t<租户>/<产品>/<项目>`)。 */
159
+ project: string;
160
+ /** 项目工作区绝对路径。**能力不从卡片收路径**,只从这里取根。 */
161
+ projectDir: string;
162
+ }
163
+ /** 同步能力:`run` 返回即完成。 */
164
+ export interface SpsSyncCapability extends SpsCapabilityBase {
165
+ mode: 'sync';
166
+ run(input: unknown, ctx: SpsCapabilityCtx): Promise<Record<string, unknown>>;
167
+ }
168
+ /**
169
+ * 异步能力:`start` 立刻返回,引擎每个 tick `poll` 一次。
170
+ *
171
+ * 🔴 **卡片在真正跑完之前不标 Done** —— 波次屏障(`order`)因此天然成为 join。
172
+ * "打包必须等美术"用 order 表达即可,没有单独的 join 卡执行路径,也不需要。
173
+ */
174
+ export interface SpsAsyncCapability extends SpsCapabilityBase {
175
+ mode: 'async';
176
+ /** 启动外部任务并**立刻返回**。handle 存进卡片 meta。 */
177
+ start(input: unknown, ctx: SpsCapabilityCtx): Promise<{
178
+ handle: string;
179
+ }>;
180
+ /**
181
+ * 问状态。**每个 tick 都会调 ⇒ 必须便宜且幂等。**
182
+ * 别在这里重新扫盘或重新请求全量 —— 它会按 tick 频率被放大。
183
+ */
184
+ poll(handle: string, ctx: SpsCapabilityCtx): Promise<SpsAsyncPoll>;
185
+ /**
186
+ * 多久算超时(ms)。缺省 **30 分钟**。
187
+ * ⚠️ 超时**由引擎按 startedAt 判**,不问你 —— 你可能正好卡死在自己的等待上。
188
+ */
189
+ timeoutMs?: number;
141
190
  }
191
+ export type SpsCapability = SpsSyncCapability | SpsAsyncCapability;
142
192
  export interface SpsCapabilities {
143
193
  register(cap: SpsCapability): () => void;
144
194
  get(id: string): SpsCapability | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-plugin-api",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "sps 宿主半区的插件契约:ctx 上那些服务的方法签名。插件装它拿类型。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",