@sumicom/quicksave 0.8.0 → 0.8.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.
Files changed (41) hide show
  1. package/README.md +4 -0
  2. package/dist/ai/cardBuilder.d.ts +2 -0
  3. package/dist/ai/cardBuilder.d.ts.map +1 -1
  4. package/dist/ai/cardBuilder.js +62 -0
  5. package/dist/ai/cardBuilder.js.map +1 -1
  6. package/dist/ai/claudeCliProvider.d.ts +25 -1
  7. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  8. package/dist/ai/claudeCliProvider.js +77 -53
  9. package/dist/ai/claudeCliProvider.js.map +1 -1
  10. package/dist/ai/codexLogin.d.ts +57 -0
  11. package/dist/ai/codexLogin.d.ts.map +1 -0
  12. package/dist/ai/codexLogin.js +240 -0
  13. package/dist/ai/codexLogin.js.map +1 -0
  14. package/dist/ai/codexSdkProvider.d.ts.map +1 -1
  15. package/dist/ai/codexSdkProvider.js +66 -5
  16. package/dist/ai/codexSdkProvider.js.map +1 -1
  17. package/dist/ai/provider.d.ts +5 -0
  18. package/dist/ai/provider.d.ts.map +1 -1
  19. package/dist/ai/sessionManager.d.ts +6 -0
  20. package/dist/ai/sessionManager.d.ts.map +1 -1
  21. package/dist/ai/sessionManager.js +90 -4
  22. package/dist/ai/sessionManager.js.map +1 -1
  23. package/dist/files/fileBrowser.d.ts +25 -0
  24. package/dist/files/fileBrowser.d.ts.map +1 -0
  25. package/dist/files/fileBrowser.js +186 -0
  26. package/dist/files/fileBrowser.js.map +1 -0
  27. package/dist/handlers/messageHandler.d.ts +88 -8
  28. package/dist/handlers/messageHandler.d.ts.map +1 -1
  29. package/dist/handlers/messageHandler.js +411 -52
  30. package/dist/handlers/messageHandler.js.map +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/service/ipcClient.js +1 -1
  33. package/dist/service/run.d.ts.map +1 -1
  34. package/dist/service/run.js +57 -4
  35. package/dist/service/run.js.map +1 -1
  36. package/dist/service/types.js +1 -1
  37. package/dist/terminal/terminalManager.d.ts +48 -0
  38. package/dist/terminal/terminalManager.d.ts.map +1 -0
  39. package/dist/terminal/terminalManager.js +244 -0
  40. package/dist/terminal/terminalManager.js.map +1 -0
  41. package/package.json +4 -3
@@ -1,7 +1,8 @@
1
- import { Message, License, Repository, SessionRegistryEntry } from '@sumicom/quicksave-shared';
1
+ import { Message, License, Repository, SessionRegistryEntry, CodexModelInfo } from '@sumicom/quicksave-shared';
2
2
  import type { PushClient } from '../service/pushClient.js';
3
3
  import { CommitSummaryStateStore } from '../ai/commitSummaryStore.js';
4
4
  import { SessionManager } from '../ai/sessionManager.js';
5
+ import { CodexLoginManager } from '../ai/codexLogin.js';
5
6
  export declare class MessageHandler {
6
7
  private repos;
7
8
  private agentVersion;
@@ -21,20 +22,74 @@ export declare class MessageHandler {
21
22
  private versionCheckInFlight;
22
23
  private codexModelsCache;
23
24
  private codexModelsCheckInFlight;
25
+ private codexModelsUpdateHandler;
26
+ private codexModelsWatcher;
27
+ private codexModelsWatchDebounce;
28
+ /** Override for tests; defaults to `~/.codex`. */
29
+ private readonly codexCacheDir;
30
+ private codexLoginManager;
24
31
  onHistoryUpdated?: (cwd: string, entry: SessionRegistryEntry, action: 'upsert' | 'delete') => void;
25
32
  private productionBuild;
26
- constructor(repos: Repository[], _license?: License, codingPaths?: string[], productionBuild?: boolean);
33
+ constructor(repos: Repository[], _license?: License, codingPaths?: string[], productionBuild?: boolean, options?: {
34
+ codexCacheDir?: string;
35
+ });
27
36
  /**
28
37
  * Check npm registry for latest version. Deduped: returns cached value
29
38
  * if checked within the last 12 hours. Only runs in production builds.
30
39
  */
31
40
  private checkLatestVersion;
32
41
  /**
33
- * Fetch available Codex models from OpenAI /v1/models. Reads API key from
34
- * ~/.codex/auth.json (ChatGPT OAuth token or OPENAI_API_KEY). Cached for 12h
35
- * with concurrent-request dedup — same pattern as checkLatestVersion.
42
+ * Resolve the Codex model list for the current user.
43
+ *
44
+ * Priority:
45
+ * 1. `~/.codex/models_cache.json` — the Codex CLI's own cache of
46
+ * models the signed-in account can actually use. This is the
47
+ * authoritative list for ChatGPT-OAuth logins (the common case)
48
+ * and is kept fresh by the CLI itself. Reads are essentially free,
49
+ * so we use a short 5min in-memory TTL — and `startCodexModelsWatcher`
50
+ * invalidates the cache the moment the file is rewritten.
51
+ * 2. `OPENAI_API_KEY` env var + OpenAI `/v1/models` — fallback for
52
+ * API-key users, who are rare but still supported. Held to a 1h
53
+ * sub-TTL so we don't hammer OpenAI when the local cache is absent.
54
+ *
55
+ * Returns `null` when neither source is available (not logged in and no
56
+ * API key set). Concurrent calls are deduped.
36
57
  */
37
58
  private fetchCodexModels;
59
+ /** Snapshot accessor for the bus `/codex/models` subscription. */
60
+ getCachedCodexModels(): CodexModelInfo[];
61
+ /**
62
+ * Wire the daemon's bus broadcast for unsolicited model-list pushes.
63
+ * Called once during daemon boot; the watcher invokes this on cache change.
64
+ */
65
+ setCodexModelsUpdateHandler(handler: (models: CodexModelInfo[]) => void): void;
66
+ /**
67
+ * Watch the Codex CLI cache directory and refresh the in-memory model list
68
+ * the moment the CLI rewrites it (typically after a `codex` startup or
69
+ * upgrade). Tolerant of a missing `~/.codex` directory — falls back to TTL
70
+ * alone if the watch can't be set up. Idempotent.
71
+ */
72
+ startCodexModelsWatcher(): void;
73
+ /** Tear down the fs.watch handle (test cleanup). */
74
+ stopCodexModelsWatcher(): void;
75
+ private scheduleCodexModelsRefresh;
76
+ private refreshCodexModelsAndPublish;
77
+ /**
78
+ * Read models from the Codex CLI's local cache. File shape (as of codex
79
+ * CLI v0.125): `{ models: [{ slug, display_name, visibility, supported_in_api, ... }] }`.
80
+ * We surface only entries that are listable and API-supported, so hidden
81
+ * internal models (e.g. `codex-auto-review`) don't leak into the picker.
82
+ */
83
+ private readCodexModelsCacheFile;
84
+ /** Fallback for API-key users (no ChatGPT OAuth). */
85
+ private fetchCodexModelsFromOpenAI;
86
+ /**
87
+ * Best-effort check for whether the local Codex CLI has valid auth.
88
+ * Matches how `fetchCodexModels` resolves credentials, so the PWA can
89
+ * prompt for login when this returns false. Does not validate the
90
+ * token — just checks that a credential source exists.
91
+ */
92
+ private getCodexLoginStatus;
38
93
  addRepo(repo: Repository): void;
39
94
  removeRepo(path: string): void;
40
95
  private getClientRepoPath;
@@ -106,6 +161,16 @@ export declare class MessageHandler {
106
161
  private handleAgentUpdate;
107
162
  private handleAgentRestart;
108
163
  private handleCodexListModels;
164
+ /**
165
+ * Kick off the Codex device-auth OAuth flow on the daemon. Returns the
166
+ * one-time verification URL + user code so the PWA can display them — the
167
+ * user typically completes this on a different device (e.g. phone).
168
+ */
169
+ private handleCodexLoginStart;
170
+ private handleCodexLoginStatus;
171
+ private handleCodexLoginCancel;
172
+ /** Expose for the daemon to wire login-state updates into bus broadcasts. */
173
+ getCodexLoginManager(): CodexLoginManager;
109
174
  private handleClaudeStart;
110
175
  private handleClaudeResume;
111
176
  private handleClaudeCancel;
@@ -122,16 +187,31 @@ export declare class MessageHandler {
122
187
  private handleListProjectSummaries;
123
188
  private handleListProjectRepos;
124
189
  /**
125
- * Hide a project without touching the filesystem. Archives every active
126
- * session under `cwd` (each archive fires `/sessions/history` so PWAs drop
127
- * the sessions from their live view) and removes the cwd from managed
190
+ * Hide a project without touching the filesystem. Closes every live
191
+ * Claude session under `cwd` (so a stray resume can't re-materialize an
192
+ * active registry entry see note below), archives every registry entry
193
+ * under `cwd` (each archive fires `/sessions/history` so PWAs drop the
194
+ * sessions from their live view), and removes the cwd from managed
128
195
  * coding paths so it stops surfacing as an empty workspace. Archived
129
196
  * session JSON stays on disk and can be restored individually.
197
+ *
198
+ * Why close live sessions first: `handleClaudeResume` builds a fresh
199
+ * active registry entry when `getEntry` returns undefined (archived
200
+ * entries aren't in memory). Without this step, any subsequent resume
201
+ * of a still-running session re-creates the active entry and the
202
+ * project reappears on the next project:list-summaries.
130
203
  */
131
204
  private handleDeleteProject;
132
205
  private getGitBranchQuiet;
133
206
  private getGitDirtyQuiet;
134
207
  private handlePushSubscriptionOffer;
208
+ private handleTerminalCreate;
209
+ private handleTerminalInput;
210
+ private handleTerminalResize;
211
+ private handleTerminalClose;
212
+ private handleTerminalRename;
213
+ private handleFilesList;
214
+ private handleFilesRead;
135
215
  private createErrorResponse;
136
216
  }
137
217
  //# sourceMappingURL=messageHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/messageHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/messageHandler.ts"],"names":[],"mappings":"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"}