@yinxe/opencode-tui-usage 1.0.1 → 1.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE;QACZ,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAC1C,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACnD,0BAA0B,IAAI,MAAM,EAAE,CAAC;QACvC,0BAA0B,IAAI,MAAM,EAAE,CAAC;KACxC,CAAC;IACF,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CA0M5D"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE;QACZ,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAC1C,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACnD,0BAA0B,IAAI,MAAM,EAAE,CAAC;QACvC,0BAA0B,IAAI,MAAM,EAAE,CAAC;KACxC,CAAC;IACF,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CA4N5D"}
package/dist/usage.jsx CHANGED
@@ -39,19 +39,49 @@ export function UsageView(props) {
39
39
  const [fetchError, setFetchError] = createSignal(null);
40
40
  // 请求 ID 计数器,用于处理竞态条件
41
41
  let currentRequestId = 0;
42
- // effect:检测 provider 并获取额度数据
42
+ // v1.0.0 恢复的刷新逻辑:只在 provider/model 组合变化时刷新
43
+ const doRefresh = () => {
44
+ const providerID = currentProvider();
45
+ if (!providerID)
46
+ return;
47
+ const requestId = ++currentRequestId;
48
+ setLoading(true);
49
+ setFetchError(null);
50
+ const supported = props.quotaService.setActiveProvider(providerID);
51
+ setProviderSupported(supported);
52
+ if (!supported) {
53
+ setResult(null);
54
+ setLoading(false);
55
+ return;
56
+ }
57
+ props.quotaService.fetchQuota().then((data) => {
58
+ if (requestId !== currentRequestId)
59
+ return;
60
+ if (data && data.quota) {
61
+ setResult(data);
62
+ }
63
+ else {
64
+ setResult(null);
65
+ }
66
+ setLoading(false);
67
+ }).catch((error) => {
68
+ if (requestId !== currentRequestId)
69
+ return;
70
+ console.error("[UsageView] Failed to fetch quota:", error);
71
+ setFetchError(String(error));
72
+ setResult(null);
73
+ setLoading(false);
74
+ });
75
+ };
76
+ // Effect 1: 检测 session 消息,提取 provider/model
43
77
  createEffect(() => {
44
78
  const sessionId = props.sessionId;
45
79
  const messages = props.api.state.session.messages(sessionId);
46
- const requestId = ++currentRequestId;
47
- // 无消息时重置状态
48
80
  if (!messages || messages.length === 0) {
49
81
  setCurrentProvider(null);
50
82
  setCurrentModel(null);
51
83
  setFetchError(null);
52
84
  setProviderSupported(false);
53
- setResult(null);
54
- setLoading(false);
55
85
  return;
56
86
  }
57
87
  // 从后向前查找最后一个 assistant 消息
@@ -67,63 +97,47 @@ export function UsageView(props) {
67
97
  setCurrentModel(null);
68
98
  setFetchError(null);
69
99
  setProviderSupported(false);
70
- setResult(null);
71
- setLoading(false);
72
100
  return;
73
101
  }
74
- // 检查 providerID 类型是否正确
75
102
  if (!("providerID" in lastAssistantMsg) || typeof lastAssistantMsg.providerID !== "string") {
76
103
  setCurrentProvider(null);
77
104
  setCurrentModel(null);
78
105
  setFetchError(null);
79
106
  setProviderSupported(false);
80
- setResult(null);
81
- setLoading(false);
82
107
  return;
83
108
  }
84
109
  const providerID = lastAssistantMsg.providerID;
85
110
  const modelID = "modelID" in lastAssistantMsg && typeof lastAssistantMsg.modelID === "string"
86
111
  ? lastAssistantMsg.modelID
87
112
  : "";
88
- setCurrentProvider(providerID);
89
- setCurrentModel(modelID);
90
- // 设置 Provider 并获取额度数据
91
- setLoading(true);
92
- setFetchError(null);
93
- const supported = props.quotaService.setActiveProvider(providerID);
94
- setProviderSupported(supported);
95
- if (!supported) {
113
+ // 检查是否真的发生了变化
114
+ if (providerID !== currentProvider() || modelID !== currentModel()) {
115
+ setCurrentProvider(providerID);
116
+ setCurrentModel(modelID);
117
+ }
118
+ });
119
+ // Effect 2: 监听 provider 变化,触发额度获取
120
+ createEffect(() => {
121
+ const providerID = currentProvider();
122
+ if (!providerID) {
96
123
  setResult(null);
97
124
  setLoading(false);
125
+ setProviderSupported(false);
98
126
  return;
99
127
  }
100
- props.quotaService.fetchQuota()
101
- .then((data) => {
102
- // 忽略过期响应(provider 已切换)
103
- if (requestId !== currentRequestId)
104
- return;
105
- if (data && data.quota) {
106
- setResult(data);
107
- }
108
- else {
109
- setResult(null);
110
- }
111
- setLoading(false);
112
- })
113
- .catch((error) => {
114
- if (requestId !== currentRequestId)
115
- return;
116
- console.error("[UsageView] Failed to fetch quota:", error);
117
- setFetchError(String(error));
118
- setResult(null);
119
- setLoading(false);
120
- });
128
+ doRefresh();
121
129
  });
122
- // 倒计时定时器 effect
130
+ // Effect 3: 倒计时定时器,归零时触发刷新
123
131
  createEffect(() => {
124
132
  setRefreshCountdown(REFRESH_INTERVAL);
125
133
  const id = setInterval(() => {
126
- setRefreshCountdown((r) => (r <= 1 ? REFRESH_INTERVAL : r - 1));
134
+ setRefreshCountdown((r) => {
135
+ if (r <= 1) {
136
+ doRefresh();
137
+ return REFRESH_INTERVAL;
138
+ }
139
+ return r - 1;
140
+ });
127
141
  }, 1000);
128
142
  onCleanup(() => clearInterval(id));
129
143
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yinxe/opencode-tui-usage",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "OpenCode TUI 额度显示插件 - 在侧边栏显示用量和额度信息",
5
5
  "repository": "github:Yinxe/opencode-tui-usage",
6
6
  "type": "module",