@optima-chat/agentic-sdk 0.27.1 → 0.28.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.
@@ -22,9 +22,18 @@ export interface UseTasksResult {
22
22
  refetch: () => void;
23
23
  }
24
24
  /**
25
- * useTasks — hydrates the tasks store slice from REST, lets live task_* WS
26
- * events keep it authoritative (via B3's store slice), and derives a `stale`
27
- * flag for ghost `running` rows as a #979 mitigation.
25
+ * useTasks — hydrates the tasks store slice from REST (user-wide via
26
+ * `listAllTasks` when the provider supports it, #1591; else legacy
27
+ * per-session `listTasks(sessionId)`; user-wide 端点缺失(404/501)时同样回退
28
+ * per-session,解耦 gateway 部署顺序), and derives a `stale` flag for ghost
29
+ * `running` rows as a #979 mitigation.
30
+ *
31
+ * Authority model(聚合模式下按 session 分野,review Important-4):
32
+ * - 当前 session 的行:live task_* WS 事件(B3 store slice)保持权威 ——
33
+ * task_* 只经该 session 自己的反向 WS 上行,gateway 无 user 级 fanout。
34
+ * - 跨 session 的行:WS 事件到不了,终态只能靠重新 hydrate 收敛
35
+ * (mount / sessionId 变化 / 消费方接 refetch 于 WS 重连时)。无定时对账 ——
36
+ * 其他 session 已完成的任务在下次 hydrate 前可能仍显示进行中。
28
37
  *
29
38
  * Missing-provider behavior matches useWorkspaceFiles exactly: throw if
30
39
  * `tasksProvider` is null on the context.
@@ -1 +1 @@
1
- {"version":3,"file":"use-tasks.d.ts","sourceRoot":"","sources":["../../src/hooks/use-tasks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,cAAc,CA2E/D"}
1
+ {"version":3,"file":"use-tasks.d.ts","sourceRoot":"","sources":["../../src/hooks/use-tasks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,cAAc,CAmI/D"}
@@ -15,9 +15,18 @@ import { useChatContext } from '../provider/chat-context.js';
15
15
  */
16
16
  export const DEFAULT_TASK_STALE_AFTER_MS = 70 * 60 * 1000; // 70 min
17
17
  /**
18
- * useTasks — hydrates the tasks store slice from REST, lets live task_* WS
19
- * events keep it authoritative (via B3's store slice), and derives a `stale`
20
- * flag for ghost `running` rows as a #979 mitigation.
18
+ * useTasks — hydrates the tasks store slice from REST (user-wide via
19
+ * `listAllTasks` when the provider supports it, #1591; else legacy
20
+ * per-session `listTasks(sessionId)`; user-wide 端点缺失(404/501)时同样回退
21
+ * per-session,解耦 gateway 部署顺序), and derives a `stale` flag for ghost
22
+ * `running` rows as a #979 mitigation.
23
+ *
24
+ * Authority model(聚合模式下按 session 分野,review Important-4):
25
+ * - 当前 session 的行:live task_* WS 事件(B3 store slice)保持权威 ——
26
+ * task_* 只经该 session 自己的反向 WS 上行,gateway 无 user 级 fanout。
27
+ * - 跨 session 的行:WS 事件到不了,终态只能靠重新 hydrate 收敛
28
+ * (mount / sessionId 变化 / 消费方接 refetch 于 WS 重连时)。无定时对账 ——
29
+ * 其他 session 已完成的任务在下次 hydrate 前可能仍显示进行中。
21
30
  *
22
31
  * Missing-provider behavior matches useWorkspaceFiles exactly: throw if
23
32
  * `tasksProvider` is null on the context.
@@ -36,21 +45,65 @@ export function useTasks(opts) {
36
45
  const [error, setError] = useState(null);
37
46
  // ── Hydration ──────────────────────────────────────────────────────────────
38
47
  const hydrate = useCallback(async () => {
39
- if (!sessionId)
40
- return; // no session yet — stay idle
48
+ // #1591 止血 B:部署替换容器后前端拿到**新** sessionId,per-session 快照查到
49
+ // 空 → 面板清零。provider 支持 listAllTasks(user-wide,服务端从 token 自解
50
+ // userId)时走它,hydrate 不再依赖 sessionId 触发/过滤。
51
+ // 回退(BC):第三方注入的 TasksProvider 可能没实现 listAllTasks —— 保留旧的
52
+ // per-session 行为(需要 sessionId,否则保持 idle)。
53
+ const listAllTasks = typeof tasksProvider.listAllTasks === 'function'
54
+ ? tasksProvider.listAllTasks.bind(tasksProvider)
55
+ : undefined;
56
+ if (!listAllTasks && !sessionId)
57
+ return; // legacy path: no session yet — stay idle
41
58
  setIsLoading(true);
42
59
  setError(null);
43
60
  try {
44
- const restRows = await tasksProvider.listTasks(sessionId);
61
+ let restRows;
62
+ if (listAllTasks) {
63
+ try {
64
+ restRows = await listAllTasks();
65
+ }
66
+ catch (err) {
67
+ // 部署解耦(review Important-1):gateway 侧 user-wide 端点未上线的环境
68
+ // (404/501,如 epic/coo 未合入)回退旧 per-session hydrate —— 面板不空,
69
+ // 行为不差于旧版。其他错误(网络/5xx)照常抛给外层 setError。
70
+ const status = err?.status;
71
+ const endpointMissing = status === 404 || status === 501;
72
+ if (!endpointMissing)
73
+ throw err;
74
+ if (!sessionId) {
75
+ // 端点缺失且尚无 session:与 legacy gate 一致,保持 idle 不报错。
76
+ return;
77
+ }
78
+ restRows = await tasksProvider.listTasks(sessionId);
79
+ }
80
+ }
81
+ else {
82
+ restRows = await tasksProvider.listTasks(sessionId);
83
+ }
45
84
  // Merge-prefer-terminal: if a live WS event already landed a terminal
46
85
  // (completed/failed) row while listTasks was in-flight, keep that row
47
86
  // rather than overwriting it with the stale REST "running" snapshot.
48
87
  // Live WS events are one-shot; the REST result cannot self-heal them.
88
+ //
89
+ // Key (review PLAUSIBLE-5): task id 只在 session 内唯一,跨 session 可撞名
90
+ // (gateway 刻意如此)——按 `${sessionId}:${id}` 复合键 merge;WS 行不带
91
+ // sessionId,退化裸 id 与同 id REST 行配对(接受该退化:极小概率把别的
92
+ // session 的同 id 行认成当前 session 的)。
93
+ const keyOf = (t) => t.sessionId !== undefined ? `${t.sessionId}:${t.id}` : t.id;
49
94
  const currentTasks = store.getState().tasks;
50
- const storeById = new Map(currentTasks.map((t) => [t.id, t]));
51
- const restIds = new Set(restRows.map((r) => r.id));
95
+ const storeByKey = new Map(currentTasks.map((t) => [keyOf(t), t]));
96
+ const restKeys = new Set(restRows.map((r) => keyOf(r)));
97
+ const restBareIds = new Set(restRows.map((r) => r.id));
52
98
  const merged = restRows.map((restRow) => {
53
- const storeRow = storeById.get(restRow.id);
99
+ // 复合键精确命中优先;REST 行带 sessionId 而 miss 时,退化找 WS 裸行。
100
+ let storeRow = storeByKey.get(keyOf(restRow));
101
+ if (!storeRow && restRow.sessionId !== undefined) {
102
+ storeRow = storeByKey.get(restRow.id);
103
+ // 裸行一次性认领,避免同 id 多 session 的 REST 行重复吞并同一 WS 行。
104
+ if (storeRow)
105
+ storeByKey.delete(restRow.id);
106
+ }
54
107
  if (storeRow && (storeRow.status === 'completed' || storeRow.status === 'failed')) {
55
108
  // The store has a terminal row — live WS authority wins over REST.
56
109
  return storeRow;
@@ -59,8 +112,12 @@ export function useTasks(opts) {
59
112
  });
60
113
  // Append live-only rows that REST didn't return (e.g. tasks started
61
114
  // very recently and not yet reflected in the REST snapshot).
115
+ // WS 裸行(无 sessionId)按裸 id 判断是否已被 REST 覆盖,与上面的退化一致。
62
116
  for (const storeRow of currentTasks) {
63
- if (!restIds.has(storeRow.id)) {
117
+ const covered = storeRow.sessionId !== undefined
118
+ ? restKeys.has(keyOf(storeRow))
119
+ : restBareIds.has(storeRow.id);
120
+ if (!covered) {
64
121
  merged.push(storeRow);
65
122
  }
66
123
  }
@@ -79,9 +136,18 @@ export function useTasks(opts) {
79
136
  // ── Staleness derivation (#979 backstop) ───────────────────────────────────
80
137
  const staleAfterMs = opts?.staleAfterMs ?? DEFAULT_TASK_STALE_AFTER_MS;
81
138
  const now = Date.now();
82
- const tasks = rawTasks.map((t) => t.status === 'running' && now - Date.parse(t.startedAt) > staleAfterMs
139
+ // 排序放派生层而非 hydrate(review Important-3):live WS 行在 store 里 append 到底,
140
+ // 聚合模式下列表是全量历史 —— 若只在 hydrate 时排,刚启动的任务会沉底首屏不可见。
141
+ // startedAt 不可解析(WS 终态先到的占位行 startedAt='')按 0 处理,沉底。
142
+ const startedAtMs = (t) => {
143
+ const ms = Date.parse(t.startedAt);
144
+ return Number.isNaN(ms) ? 0 : ms;
145
+ };
146
+ const tasks = rawTasks
147
+ .map((t) => t.status === 'running' && now - Date.parse(t.startedAt) > staleAfterMs
83
148
  ? { ...t, stale: true }
84
- : t);
149
+ : t)
150
+ .sort((a, b) => startedAtMs(b) - startedAtMs(a));
85
151
  // ── refetch (for WS-reconnect reconciliation) ──────────────────────────────
86
152
  const refetch = useCallback(() => {
87
153
  void hydrate();
@@ -1 +1 @@
1
- {"version":3,"file":"use-tasks.js","sourceRoot":"","sources":["../../src/hooks/use-tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-tasks.js","sourceRoot":"","sources":["../../src/hooks/use-tasks.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -25,7 +25,7 @@ export type { ChatProviderProps, ConnectionState, MessageStatus, ToolCallStatus,
25
25
  export type { WorkspaceProvider, WorkspaceFile, FilePreview, ShareLink, UploadProgress, AuthenticatedUploader, UploadOptions, ListOptions, DeleteOptions, } from './workspace/types.js';
26
26
  export { WorkspaceFileError } from './workspace/errors.js';
27
27
  export { createDefaultWorkspaceProvider, type DefaultWorkspaceProviderOptions, } from './workspace/default-provider.js';
28
- export type { TasksProvider, NormalizedTask } from './tasks/types.js';
29
- export { createDefaultTasksProvider } from './tasks/default-provider.js';
28
+ export type { TasksProvider, NormalizedTask, NormalizedTaskStatus, UserTaskState } from './tasks/types.js';
29
+ export { createDefaultTasksProvider, TasksProviderHttpError } from './tasks/default-provider.js';
30
30
  export type { ServerEvent, ClientEvent, FinishInfo, Question, ApprovalRequest, ApprovalResponse, TokenProgress, BillingError, WorkerTaskState, WorkerTaskStatus, WorkerTaskKind, } from '@optima-chat/gateway-protocol';
31
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAK3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACxF,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGxG,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,SAAS,EACT,YAAY,EACZ,2BAA2B,EAC3B,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,8BAA8B,EAC9B,KAAK,+BAA+B,GACrC,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAGzE,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAK3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACxF,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGxG,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,SAAS,EACT,YAAY,EACZ,2BAA2B,EAC3B,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,8BAA8B,EAC9B,KAAK,+BAA+B,GACrC,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGjG,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -23,5 +23,5 @@ export { useDeleteFile, useRenameFile, useUploadFiles, useMakeDirectory, } from
23
23
  export { workspaceKeys, WORKSPACE_DEFAULT_PATH } from './hooks/workspace-query-keys.js';
24
24
  export { WorkspaceFileError } from './workspace/errors.js';
25
25
  export { createDefaultWorkspaceProvider, } from './workspace/default-provider.js';
26
- export { createDefaultTasksProvider } from './tasks/default-provider.js';
26
+ export { createDefaultTasksProvider, TasksProviderHttpError } from './tasks/default-provider.js';
27
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,2DAA2D;AAC3D,8EAA8E;AAC9E,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAM5C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAkCxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,2DAA2D;AAC3D,8EAA8E;AAC9E,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAM5C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAkCxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,7 +1,17 @@
1
1
  import type { AuthFetch, TasksProvider } from './types.js';
2
+ /**
3
+ * HTTP error thrown by the default TasksProvider. Carries the response
4
+ * `status` so callers (useTasks) can distinguish endpoint-missing
5
+ * (404/501 → fall back to per-session `listTasks`) from other failures.
6
+ */
7
+ export declare class TasksProviderHttpError extends Error {
8
+ readonly status: number;
9
+ constructor(operation: string, status: number);
10
+ }
2
11
  /**
3
12
  * Default TasksProvider backed by the gateway's
4
- * `GET /api/sessions/{sessionId}/tasks` endpoint.
13
+ * `GET /api/sessions/{sessionId}/tasks` (per-session) and
14
+ * `GET /api/users/me/tasks` (user-wide, #1591) endpoints.
5
15
  *
6
16
  * @param gatewayBaseUrl Gateway origin (e.g. `https://gateway.example.com`).
7
17
  * Trailing slash tolerated.
@@ -1 +1 @@
1
- {"version":3,"file":"default-provider.d.ts","sourceRoot":"","sources":["../../src/tasks/default-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,SAAS,GAC5B,aAAa,CAmBf"}
1
+ {"version":3,"file":"default-provider.d.ts","sourceRoot":"","sources":["../../src/tasks/default-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAE1E;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,SAAS,GAC5B,aAAa,CAoCf"}
@@ -1,6 +1,20 @@
1
+ /**
2
+ * HTTP error thrown by the default TasksProvider. Carries the response
3
+ * `status` so callers (useTasks) can distinguish endpoint-missing
4
+ * (404/501 → fall back to per-session `listTasks`) from other failures.
5
+ */
6
+ export class TasksProviderHttpError extends Error {
7
+ status;
8
+ constructor(operation, status) {
9
+ super(`${operation} failed: ${status}`);
10
+ this.name = 'TasksProviderHttpError';
11
+ this.status = status;
12
+ }
13
+ }
1
14
  /**
2
15
  * Default TasksProvider backed by the gateway's
3
- * `GET /api/sessions/{sessionId}/tasks` endpoint.
16
+ * `GET /api/sessions/{sessionId}/tasks` (per-session) and
17
+ * `GET /api/users/me/tasks` (user-wide, #1591) endpoints.
4
18
  *
5
19
  * @param gatewayBaseUrl Gateway origin (e.g. `https://gateway.example.com`).
6
20
  * Trailing slash tolerated.
@@ -18,7 +32,22 @@ export function createDefaultTasksProvider(gatewayBaseUrl, authenticatedFetch) {
18
32
  : `${base}${path}`;
19
33
  const res = await authenticatedFetch(url, { method: 'GET' });
20
34
  if (!res.ok) {
21
- throw new Error(`listTasks failed: ${res.status}`);
35
+ throw new TasksProviderHttpError('listTasks', res.status);
36
+ }
37
+ const body = (await res.json());
38
+ return body.tasks;
39
+ },
40
+ // #1591 止血 B:user-wide 列表。服务端从 token 自解 userId(无必选参数),
41
+ // 部署换 session 后初次 hydrate 不再因 per-session 查询清零面板。
42
+ // `opts` 预留(review NIT):kind 与 listTasks 同语义转发为查询参数。
43
+ async listAllTasks(opts) {
44
+ const path = `/api/users/me/tasks`;
45
+ const url = opts?.kind !== undefined
46
+ ? `${base}${path}?kind=${encodeURIComponent(opts.kind)}`
47
+ : `${base}${path}`;
48
+ const res = await authenticatedFetch(url, { method: 'GET' });
49
+ if (!res.ok) {
50
+ throw new TasksProviderHttpError('listAllTasks', res.status);
22
51
  }
23
52
  const body = (await res.json());
24
53
  return body.tasks;
@@ -1 +1 @@
1
- {"version":3,"file":"default-provider.js","sourceRoot":"","sources":["../../src/tasks/default-provider.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CACxC,cAAsB,EACtB,kBAA6B;IAE7B,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAEzF,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,IAAgC;YACjE,MAAM,IAAI,GAAG,iBAAiB,SAAS,QAAQ,CAAC;YAChD,MAAM,GAAG,GACP,IAAI,EAAE,IAAI,KAAK,SAAS;gBACtB,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxD,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YAEvB,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiC,CAAC;YAChE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"default-provider.js","sourceRoot":"","sources":["../../src/tasks/default-provider.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,MAAM,CAAS;IACxB,YAAY,SAAiB,EAAE,MAAc;QAC3C,KAAK,CAAC,GAAG,SAAS,YAAY,MAAM,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,0BAA0B,CACxC,cAAsB,EACtB,kBAA6B;IAE7B,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAEzF,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,IAAgC;YACjE,MAAM,IAAI,GAAG,iBAAiB,SAAS,QAAQ,CAAC;YAChD,MAAM,GAAG,GACP,IAAI,EAAE,IAAI,KAAK,SAAS;gBACtB,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxD,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YAEvB,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,sBAAsB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiC,CAAC;YAChE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,uDAAuD;QACvD,kDAAkD;QAClD,qDAAqD;QACrD,KAAK,CAAC,YAAY,CAAC,IAAgC;YACjD,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACnC,MAAM,GAAG,GACP,IAAI,EAAE,IAAI,KAAK,SAAS;gBACtB,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxD,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,sBAAsB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+B,CAAC;YAC9D,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,12 @@
1
- import type { WorkerTaskState, WorkerTaskKind } from '@optima-chat/gateway-protocol';
1
+ import type { WorkerTaskState, WorkerTaskKind, WorkerTaskStatus } from '@optima-chat/gateway-protocol';
2
+ /**
3
+ * Task status as actually seen on the wire (review Important-2).
4
+ *
5
+ * gateway 的 per-user 端点(`/api/users/me/tasks`)对超过 staleFloor(>70min)的
6
+ * 幽灵 `running` 行返回 `timed_out` —— gateway-protocol 的 `WorkerTaskStatus`
7
+ * 尚未发布该值,先本地扩宽;protocol 发布后交集兼容。
8
+ */
9
+ export type NormalizedTaskStatus = WorkerTaskStatus | 'timed_out';
2
10
  /**
3
11
  * Authenticated fetch — structural alias matching the workspace-provider pattern.
4
12
  * NOT `typeof fetch`; the consumer-supplied function must attach Bearer tokens.
@@ -13,7 +21,30 @@ export interface TasksProvider {
13
21
  listTasks(sessionId: string, opts?: {
14
22
  kind?: WorkerTaskKind;
15
23
  }): Promise<WorkerTaskState[]>;
24
+ /**
25
+ * #1591 止血 B:user-wide task list — `GET /api/users/me/tasks`。
26
+ * 服务端从 auth token 自解 userId,无参数;响应形状与 per-session 端点相同,
27
+ * 每项多一个 `sessionId`(归属 session)。
28
+ *
29
+ * 可选(BC):第三方注入的 provider 可能没实现——useTasks 缺失时回退旧的
30
+ * per-session `listTasks(sessionId)` hydrate 行为。
31
+ *
32
+ * `opts` 预留(review NIT):与 `listTasks` 能力对称;将来加分页等不动契约。
33
+ */
34
+ listAllTasks?(opts?: {
35
+ kind?: WorkerTaskKind;
36
+ }): Promise<UserTaskState[]>;
16
37
  }
38
+ /**
39
+ * UserTaskState — per-user 端点(`/api/users/me/tasks`)返回的行:
40
+ * WorkerTaskState + 归属 `sessionId`。Local type-extend until
41
+ * @optima-chat/gateway-protocol publishes `WorkerTaskState.sessionId`;
42
+ * the intersection stays compatible once it does.
43
+ */
44
+ export type UserTaskState = Omit<WorkerTaskState, 'status'> & {
45
+ status: NormalizedTaskStatus;
46
+ sessionId?: string;
47
+ };
17
48
  /**
18
49
  * NormalizedTask — REST WorkerTaskState + optional `stale` flag.
19
50
  * The `stale` flag is set by B4 (useTasks) when the REST snapshot may be
@@ -24,8 +55,12 @@ export interface TasksProvider {
24
55
  * `WorkerTaskState.conversationId`; the intersection stays compatible once
25
56
  * it does. Absent whenever the gateway flag is off.
26
57
  */
27
- export type NormalizedTask = WorkerTaskState & {
58
+ export type NormalizedTask = Omit<WorkerTaskState, 'status'> & {
59
+ /** Wire status incl. `timed_out`(per-user 端点对幽灵行返回,见 NormalizedTaskStatus)。 */
60
+ status: NormalizedTaskStatus;
28
61
  stale?: boolean;
29
62
  conversationId?: string;
63
+ /** 归属 session(per-user hydrate #1591 带回;per-session hydrate / WS 事件行缺省)。 */
64
+ sessionId?: string;
30
65
  };
31
66
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tasks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAErF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CAC5F;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tasks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEvG;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,WAAW,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC3F;;;;;;;;;OASG;IACH,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC3E;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG;IAC5D,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG;IAC7D,+EAA+E;IAC/E,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const SDK_VERSION = "0.27.1";
1
+ export declare const SDK_VERSION = "0.28.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED by scripts/gen-version.mjs — do not edit.
2
- export const SDK_VERSION = "0.27.1";
2
+ export const SDK_VERSION = "0.28.0";
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/agentic-sdk",
3
- "version": "0.27.1",
3
+ "version": "0.28.0",
4
4
  "description": "Chat core logic for Optima gateway - Provider, hooks, store, WebSocket client",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",