@brianli/kimaki 0.4.72-brianli.1
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.
- package/bin.js +2 -0
- package/dist/ai-tool-to-genai.js +233 -0
- package/dist/ai-tool-to-genai.test.js +267 -0
- package/dist/ai-tool.js +6 -0
- package/dist/bin.js +87 -0
- package/dist/bot-token.js +121 -0
- package/dist/bot-token.test.js +134 -0
- package/dist/channel-management.js +101 -0
- package/dist/cli-parsing.test.js +89 -0
- package/dist/cli.js +2529 -0
- package/dist/commands/abort.js +82 -0
- package/dist/commands/action-buttons.js +257 -0
- package/dist/commands/add-project.js +114 -0
- package/dist/commands/agent.js +291 -0
- package/dist/commands/ask-question.js +223 -0
- package/dist/commands/compact.js +120 -0
- package/dist/commands/context-usage.js +140 -0
- package/dist/commands/create-new-project.js +118 -0
- package/dist/commands/diff.js +128 -0
- package/dist/commands/file-upload.js +275 -0
- package/dist/commands/fork.js +217 -0
- package/dist/commands/gemini-apikey.js +70 -0
- package/dist/commands/login.js +490 -0
- package/dist/commands/mention-mode.js +51 -0
- package/dist/commands/merge-worktree.js +124 -0
- package/dist/commands/model.js +694 -0
- package/dist/commands/permissions.js +163 -0
- package/dist/commands/queue.js +217 -0
- package/dist/commands/remove-project.js +115 -0
- package/dist/commands/restart-opencode-server.js +116 -0
- package/dist/commands/resume.js +159 -0
- package/dist/commands/run-command.js +79 -0
- package/dist/commands/session-id.js +78 -0
- package/dist/commands/session.js +192 -0
- package/dist/commands/share.js +80 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/undo-redo.js +159 -0
- package/dist/commands/unset-model.js +152 -0
- package/dist/commands/upgrade.js +42 -0
- package/dist/commands/user-command.js +148 -0
- package/dist/commands/verbosity.js +60 -0
- package/dist/commands/worktree-settings.js +50 -0
- package/dist/commands/worktree.js +299 -0
- package/dist/condense-memory.js +33 -0
- package/dist/config.js +110 -0
- package/dist/database.js +1050 -0
- package/dist/db.js +159 -0
- package/dist/db.test.js +49 -0
- package/dist/discord-api.js +28 -0
- package/dist/discord-auth.js +231 -0
- package/dist/discord-auth.test.js +80 -0
- package/dist/discord-bot.js +997 -0
- package/dist/discord-utils.js +560 -0
- package/dist/discord-utils.test.js +115 -0
- package/dist/errors.js +167 -0
- package/dist/escape-backticks.test.js +429 -0
- package/dist/format-tables.js +122 -0
- package/dist/format-tables.test.js +199 -0
- package/dist/forum-sync/config.js +79 -0
- package/dist/forum-sync/discord-operations.js +154 -0
- package/dist/forum-sync/index.js +5 -0
- package/dist/forum-sync/markdown.js +117 -0
- package/dist/forum-sync/sync-to-discord.js +417 -0
- package/dist/forum-sync/sync-to-files.js +190 -0
- package/dist/forum-sync/types.js +53 -0
- package/dist/forum-sync/watchers.js +307 -0
- package/dist/gateway-consumer.js +232 -0
- package/dist/gateway-consumer.test.js +18 -0
- package/dist/genai-worker-wrapper.js +111 -0
- package/dist/genai-worker.js +311 -0
- package/dist/genai.js +232 -0
- package/dist/generated/browser.js +17 -0
- package/dist/generated/client.js +35 -0
- package/dist/generated/commonInputTypes.js +10 -0
- package/dist/generated/enums.js +30 -0
- package/dist/generated/internal/class.js +41 -0
- package/dist/generated/internal/prismaNamespace.js +239 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +209 -0
- package/dist/generated/models/bot_api_keys.js +1 -0
- package/dist/generated/models/bot_tokens.js +1 -0
- package/dist/generated/models/channel_agents.js +1 -0
- package/dist/generated/models/channel_directories.js +1 -0
- package/dist/generated/models/channel_mention_mode.js +1 -0
- package/dist/generated/models/channel_models.js +1 -0
- package/dist/generated/models/channel_verbosity.js +1 -0
- package/dist/generated/models/channel_worktrees.js +1 -0
- package/dist/generated/models/forum_sync_configs.js +1 -0
- package/dist/generated/models/global_models.js +1 -0
- package/dist/generated/models/ipc_requests.js +1 -0
- package/dist/generated/models/part_messages.js +1 -0
- package/dist/generated/models/scheduled_tasks.js +1 -0
- package/dist/generated/models/session_agents.js +1 -0
- package/dist/generated/models/session_models.js +1 -0
- package/dist/generated/models/session_start_sources.js +1 -0
- package/dist/generated/models/thread_sessions.js +1 -0
- package/dist/generated/models/thread_worktrees.js +1 -0
- package/dist/generated/models.js +1 -0
- package/dist/heap-monitor.js +95 -0
- package/dist/hrana-server.js +416 -0
- package/dist/hrana-server.test.js +368 -0
- package/dist/image-utils.js +112 -0
- package/dist/interaction-handler.js +327 -0
- package/dist/ipc-polling.js +251 -0
- package/dist/kimaki-digital-twin.e2e.test.js +165 -0
- package/dist/limit-heading-depth.js +25 -0
- package/dist/limit-heading-depth.test.js +105 -0
- package/dist/logger.js +160 -0
- package/dist/markdown.js +342 -0
- package/dist/markdown.test.js +253 -0
- package/dist/message-formatting.js +433 -0
- package/dist/message-formatting.test.js +73 -0
- package/dist/openai-realtime.js +228 -0
- package/dist/opencode-plugin-loading.e2e.test.js +91 -0
- package/dist/opencode-plugin.js +536 -0
- package/dist/opencode-plugin.test.js +98 -0
- package/dist/opencode.js +409 -0
- package/dist/privacy-sanitizer.js +105 -0
- package/dist/runtime-mode.js +51 -0
- package/dist/runtime-mode.test.js +115 -0
- package/dist/sentry.js +127 -0
- package/dist/session-handler/state.js +151 -0
- package/dist/session-handler.js +1874 -0
- package/dist/session-search.js +100 -0
- package/dist/session-search.test.js +40 -0
- package/dist/startup-service.js +153 -0
- package/dist/system-message.js +499 -0
- package/dist/task-runner.js +282 -0
- package/dist/task-schedule.js +191 -0
- package/dist/task-schedule.test.js +71 -0
- package/dist/thinking-utils.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +781 -0
- package/dist/tools.js +359 -0
- package/dist/unnest-code-blocks.js +136 -0
- package/dist/unnest-code-blocks.test.js +641 -0
- package/dist/upgrade.js +114 -0
- package/dist/utils.js +109 -0
- package/dist/voice-handler.js +606 -0
- package/dist/voice.js +304 -0
- package/dist/voice.test.js +187 -0
- package/dist/wait-session.js +94 -0
- package/dist/worker-types.js +4 -0
- package/dist/worktree-utils.js +727 -0
- package/dist/xml.js +92 -0
- package/dist/xml.test.js +32 -0
- package/package.json +82 -0
- package/schema.prisma +246 -0
- package/skills/batch/SKILL.md +87 -0
- package/skills/critique/SKILL.md +129 -0
- package/skills/errore/SKILL.md +589 -0
- package/skills/goke/.prettierrc +5 -0
- package/skills/goke/CHANGELOG.md +40 -0
- package/skills/goke/LICENSE +21 -0
- package/skills/goke/README.md +666 -0
- package/skills/goke/SKILL.md +458 -0
- package/skills/goke/package.json +43 -0
- package/skills/goke/src/__test__/coerce.test.ts +411 -0
- package/skills/goke/src/__test__/index.test.ts +1798 -0
- package/skills/goke/src/__test__/types.test-d.ts +111 -0
- package/skills/goke/src/coerce.ts +547 -0
- package/skills/goke/src/goke.ts +1362 -0
- package/skills/goke/src/index.ts +16 -0
- package/skills/goke/src/mri.ts +164 -0
- package/skills/goke/tsconfig.json +15 -0
- package/skills/jitter/EDITOR.md +219 -0
- package/skills/jitter/EXPORT-INTERNALS.md +309 -0
- package/skills/jitter/SKILL.md +158 -0
- package/skills/jitter/jitter-clipboard.json +1042 -0
- package/skills/jitter/package.json +14 -0
- package/skills/jitter/tsconfig.json +15 -0
- package/skills/jitter/utils/actions.ts +212 -0
- package/skills/jitter/utils/export.ts +114 -0
- package/skills/jitter/utils/index.ts +141 -0
- package/skills/jitter/utils/snapshot.ts +154 -0
- package/skills/jitter/utils/traverse.ts +246 -0
- package/skills/jitter/utils/types.ts +279 -0
- package/skills/jitter/utils/wait.ts +133 -0
- package/skills/playwriter/SKILL.md +31 -0
- package/skills/security-review/SKILL.md +208 -0
- package/skills/simplify/SKILL.md +58 -0
- package/skills/termcast/SKILL.md +945 -0
- package/skills/tuistory/SKILL.md +250 -0
- package/skills/zustand-centralized-state/SKILL.md +582 -0
- package/src/__snapshots__/compact-session-context-no-system.md +35 -0
- package/src/__snapshots__/compact-session-context.md +41 -0
- package/src/__snapshots__/first-session-no-info.md +17 -0
- package/src/__snapshots__/first-session-with-info.md +23 -0
- package/src/__snapshots__/session-1.md +17 -0
- package/src/__snapshots__/session-2.md +5871 -0
- package/src/__snapshots__/session-3.md +17 -0
- package/src/__snapshots__/session-with-tools.md +5871 -0
- package/src/ai-tool-to-genai.test.ts +296 -0
- package/src/ai-tool-to-genai.ts +282 -0
- package/src/ai-tool.ts +39 -0
- package/src/bin.ts +108 -0
- package/src/bot-token.test.ts +171 -0
- package/src/bot-token.ts +159 -0
- package/src/channel-management.ts +172 -0
- package/src/cli-parsing.test.ts +132 -0
- package/src/cli.ts +3605 -0
- package/src/commands/abort.ts +112 -0
- package/src/commands/action-buttons.ts +376 -0
- package/src/commands/add-project.ts +152 -0
- package/src/commands/agent.ts +404 -0
- package/src/commands/ask-question.ts +330 -0
- package/src/commands/compact.ts +157 -0
- package/src/commands/context-usage.ts +199 -0
- package/src/commands/create-new-project.ts +179 -0
- package/src/commands/diff.ts +165 -0
- package/src/commands/file-upload.ts +389 -0
- package/src/commands/fork.ts +320 -0
- package/src/commands/gemini-apikey.ts +104 -0
- package/src/commands/login.ts +634 -0
- package/src/commands/mention-mode.ts +77 -0
- package/src/commands/merge-worktree.ts +177 -0
- package/src/commands/model.ts +961 -0
- package/src/commands/permissions.ts +261 -0
- package/src/commands/queue.ts +296 -0
- package/src/commands/remove-project.ts +155 -0
- package/src/commands/restart-opencode-server.ts +162 -0
- package/src/commands/resume.ts +242 -0
- package/src/commands/run-command.ts +123 -0
- package/src/commands/session-id.ts +109 -0
- package/src/commands/session.ts +250 -0
- package/src/commands/share.ts +106 -0
- package/src/commands/types.ts +25 -0
- package/src/commands/undo-redo.ts +221 -0
- package/src/commands/unset-model.ts +189 -0
- package/src/commands/upgrade.ts +52 -0
- package/src/commands/user-command.ts +193 -0
- package/src/commands/verbosity.ts +88 -0
- package/src/commands/worktree-settings.ts +79 -0
- package/src/commands/worktree.ts +431 -0
- package/src/condense-memory.ts +36 -0
- package/src/config.ts +148 -0
- package/src/database.ts +1530 -0
- package/src/db.test.ts +60 -0
- package/src/db.ts +190 -0
- package/src/discord-api.ts +35 -0
- package/src/discord-bot.ts +1316 -0
- package/src/discord-utils.test.ts +132 -0
- package/src/discord-utils.ts +767 -0
- package/src/errors.ts +213 -0
- package/src/escape-backticks.test.ts +469 -0
- package/src/format-tables.test.ts +223 -0
- package/src/format-tables.ts +145 -0
- package/src/forum-sync/config.ts +92 -0
- package/src/forum-sync/discord-operations.ts +241 -0
- package/src/forum-sync/index.ts +9 -0
- package/src/forum-sync/markdown.ts +176 -0
- package/src/forum-sync/sync-to-discord.ts +595 -0
- package/src/forum-sync/sync-to-files.ts +294 -0
- package/src/forum-sync/types.ts +175 -0
- package/src/forum-sync/watchers.ts +454 -0
- package/src/genai-worker-wrapper.ts +164 -0
- package/src/genai-worker.ts +386 -0
- package/src/genai.ts +321 -0
- package/src/generated/browser.ts +109 -0
- package/src/generated/client.ts +131 -0
- package/src/generated/commonInputTypes.ts +512 -0
- package/src/generated/enums.ts +46 -0
- package/src/generated/internal/class.ts +362 -0
- package/src/generated/internal/prismaNamespace.ts +2251 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +308 -0
- package/src/generated/models/bot_api_keys.ts +1288 -0
- package/src/generated/models/bot_tokens.ts +1577 -0
- package/src/generated/models/channel_agents.ts +1256 -0
- package/src/generated/models/channel_directories.ts +2104 -0
- package/src/generated/models/channel_mention_mode.ts +1300 -0
- package/src/generated/models/channel_models.ts +1288 -0
- package/src/generated/models/channel_verbosity.ts +1224 -0
- package/src/generated/models/channel_worktrees.ts +1308 -0
- package/src/generated/models/forum_sync_configs.ts +1452 -0
- package/src/generated/models/global_models.ts +1288 -0
- package/src/generated/models/ipc_requests.ts +1485 -0
- package/src/generated/models/part_messages.ts +1302 -0
- package/src/generated/models/scheduled_tasks.ts +2320 -0
- package/src/generated/models/session_agents.ts +1086 -0
- package/src/generated/models/session_models.ts +1114 -0
- package/src/generated/models/session_start_sources.ts +1408 -0
- package/src/generated/models/thread_sessions.ts +1599 -0
- package/src/generated/models/thread_worktrees.ts +1352 -0
- package/src/generated/models.ts +29 -0
- package/src/heap-monitor.ts +121 -0
- package/src/hrana-server.test.ts +428 -0
- package/src/hrana-server.ts +547 -0
- package/src/image-utils.ts +149 -0
- package/src/interaction-handler.ts +461 -0
- package/src/ipc-polling.ts +325 -0
- package/src/kimaki-digital-twin.e2e.test.ts +201 -0
- package/src/limit-heading-depth.test.ts +116 -0
- package/src/limit-heading-depth.ts +26 -0
- package/src/logger.ts +203 -0
- package/src/markdown.test.ts +360 -0
- package/src/markdown.ts +410 -0
- package/src/message-formatting.test.ts +81 -0
- package/src/message-formatting.ts +549 -0
- package/src/openai-realtime.ts +362 -0
- package/src/opencode-plugin-loading.e2e.test.ts +112 -0
- package/src/opencode-plugin.test.ts +108 -0
- package/src/opencode-plugin.ts +652 -0
- package/src/opencode.ts +554 -0
- package/src/privacy-sanitizer.ts +142 -0
- package/src/schema.sql +158 -0
- package/src/sentry.ts +137 -0
- package/src/session-handler/state.ts +232 -0
- package/src/session-handler.ts +2668 -0
- package/src/session-search.test.ts +50 -0
- package/src/session-search.ts +148 -0
- package/src/startup-service.ts +200 -0
- package/src/system-message.ts +568 -0
- package/src/task-runner.ts +425 -0
- package/src/task-schedule.test.ts +84 -0
- package/src/task-schedule.ts +287 -0
- package/src/thinking-utils.ts +61 -0
- package/src/thread-message-queue.e2e.test.ts +997 -0
- package/src/tools.ts +432 -0
- package/src/unnest-code-blocks.test.ts +679 -0
- package/src/unnest-code-blocks.ts +168 -0
- package/src/upgrade.ts +127 -0
- package/src/utils.ts +145 -0
- package/src/voice-handler.ts +852 -0
- package/src/voice.test.ts +219 -0
- package/src/voice.ts +444 -0
- package/src/wait-session.ts +147 -0
- package/src/worker-types.ts +64 -0
- package/src/worktree-utils.ts +988 -0
- package/src/xml.test.ts +38 -0
- package/src/xml.ts +121 -0
package/dist/sentry.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Sentry error tracking initialization and notifyError helper.
|
|
2
|
+
// Uses @sentry/node for the Node.js runtime (bot process, plugin process, worker threads).
|
|
3
|
+
// Must be initialized early in both the bot process (cli.ts) and plugin process
|
|
4
|
+
// (opencode-plugin.ts). The plugin process receives the DSN via KIMAKI_SENTRY_DSN env var.
|
|
5
|
+
import * as Sentry from '@sentry/node';
|
|
6
|
+
import * as errore from 'errore';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
import { sanitizeSensitiveText, sanitizeUnknownValue } from './privacy-sanitizer.js';
|
|
9
|
+
// DSN placeholder — replace with your Sentry project DSN.
|
|
10
|
+
// Users can also set KIMAKI_SENTRY_DSN env var.
|
|
11
|
+
const HARDCODED_DSN = 'https://3b87e21ac01cb9c66225719ea65111d2@o4510952031715328.ingest.us.sentry.io/4510952088469504';
|
|
12
|
+
function readKimakiVersion() {
|
|
13
|
+
try {
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
const pkg = require('../package.json');
|
|
16
|
+
const version = pkg.version;
|
|
17
|
+
if (!version) {
|
|
18
|
+
return 'unknown';
|
|
19
|
+
}
|
|
20
|
+
return version;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return 'unknown';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const kimakiVersion = readKimakiVersion();
|
|
27
|
+
const kimakiRelease = `kimaki@${kimakiVersion}`;
|
|
28
|
+
let initialized = false;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize Sentry. Call once at process startup.
|
|
31
|
+
* No-op if DSN is empty or --no-sentry was passed.
|
|
32
|
+
*/
|
|
33
|
+
export function initSentry({ dsn } = {}) {
|
|
34
|
+
if (process.env.KIMAKI_SENTRY_DISABLED === '1') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const resolvedDsn = dsn || process.env.KIMAKI_SENTRY_DSN || HARDCODED_DSN;
|
|
38
|
+
if (!resolvedDsn || initialized) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
Sentry.init({
|
|
42
|
+
dsn: resolvedDsn,
|
|
43
|
+
release: kimakiRelease,
|
|
44
|
+
integrations: [],
|
|
45
|
+
tracesSampleRate: 0,
|
|
46
|
+
sendDefaultPii: false,
|
|
47
|
+
profilesSampleRate: 0,
|
|
48
|
+
beforeSend(event, hint) {
|
|
49
|
+
// Skip in development — too noisy, errors appear in terminal
|
|
50
|
+
if (process.env.NODE_ENV === 'development') {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// Skip abort errors — walks the cause chain so wrapped aborts are caught
|
|
54
|
+
if (errore.isAbortError(hint.originalException)) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const sanitizedEvent = sanitizeUnknownValue(event, {
|
|
59
|
+
redactPaths: false,
|
|
60
|
+
});
|
|
61
|
+
if (sanitizedEvent && typeof sanitizedEvent === 'object') {
|
|
62
|
+
return sanitizedEvent;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return event;
|
|
67
|
+
}
|
|
68
|
+
return event;
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
Sentry.setTag('kimaki_version', kimakiVersion);
|
|
72
|
+
initialized = true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Report an unexpected error to Sentry.
|
|
76
|
+
* Safe to call even if Sentry is not initialized.
|
|
77
|
+
* Fire-and-forget only: use `void notifyError(error, msg)` and never await it.
|
|
78
|
+
* This helper must never throw.
|
|
79
|
+
* Use this at terminal error handlers — the "last catch" in a chain
|
|
80
|
+
* where the error would otherwise be invisible.
|
|
81
|
+
*/
|
|
82
|
+
export function notifyError(error, msg) {
|
|
83
|
+
try {
|
|
84
|
+
if (!initialized) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const safeMsg = (() => {
|
|
88
|
+
if (!msg) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
return sanitizeSensitiveText(msg, { redactPaths: false });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return msg;
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
98
|
+
const safeError = (() => {
|
|
99
|
+
try {
|
|
100
|
+
return sanitizeUnknownValue(error, { redactPaths: false });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return error;
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
Sentry.captureException(error, {
|
|
107
|
+
tags: { kimaki_version: kimakiVersion },
|
|
108
|
+
extra: { msg: safeMsg, kimakiVersion, error: safeError },
|
|
109
|
+
});
|
|
110
|
+
void Sentry.flush(1000).catch(() => {
|
|
111
|
+
return;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* User-readable error class. Messages from AppError instances
|
|
120
|
+
* are forwarded to the user as-is; regular Error messages may be obfuscated.
|
|
121
|
+
*/
|
|
122
|
+
export class AppError extends Error {
|
|
123
|
+
constructor(message) {
|
|
124
|
+
super(message);
|
|
125
|
+
this.name = 'AppError';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Session handler run-state store and transitions.
|
|
2
|
+
// Centralizes prompt/idle race state so interrupt handling stays consistent.
|
|
3
|
+
import { createStore } from 'zustand/vanilla';
|
|
4
|
+
function initialMainRunState() {
|
|
5
|
+
return {
|
|
6
|
+
phase: 'waiting-dispatch',
|
|
7
|
+
idleState: 'none',
|
|
8
|
+
baselineAssistantIds: new Set(),
|
|
9
|
+
currentAssistantMessageId: undefined,
|
|
10
|
+
eventSeq: 0,
|
|
11
|
+
evidenceSeq: undefined,
|
|
12
|
+
deferredIdleSeq: undefined,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function createMainRunStore() {
|
|
16
|
+
return createStore(() => {
|
|
17
|
+
return initialMainRunState();
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function beginPromptCycle({ store }) {
|
|
21
|
+
store.setState((state) => {
|
|
22
|
+
return {
|
|
23
|
+
...state,
|
|
24
|
+
phase: 'collecting-baseline',
|
|
25
|
+
idleState: 'none',
|
|
26
|
+
baselineAssistantIds: new Set(),
|
|
27
|
+
currentAssistantMessageId: undefined,
|
|
28
|
+
eventSeq: 0,
|
|
29
|
+
evidenceSeq: undefined,
|
|
30
|
+
deferredIdleSeq: undefined,
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function setBaselineAssistantIds({ store, messageIds, }) {
|
|
35
|
+
store.setState((state) => {
|
|
36
|
+
return {
|
|
37
|
+
...state,
|
|
38
|
+
baselineAssistantIds: new Set(messageIds),
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export function markDispatching({ store }) {
|
|
43
|
+
store.setState((state) => {
|
|
44
|
+
return {
|
|
45
|
+
...state,
|
|
46
|
+
phase: 'dispatching',
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function markCurrentPromptEvidence({ store, messageId, }) {
|
|
51
|
+
store.setState((state) => {
|
|
52
|
+
const eventSeq = state.eventSeq + 1;
|
|
53
|
+
const canTrackCurrentPrompt = state.phase === 'dispatching' || state.phase === 'prompt-resolved';
|
|
54
|
+
if (!canTrackCurrentPrompt) {
|
|
55
|
+
return {
|
|
56
|
+
...state,
|
|
57
|
+
eventSeq,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (state.baselineAssistantIds.has(messageId)) {
|
|
61
|
+
return {
|
|
62
|
+
...state,
|
|
63
|
+
eventSeq,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
...state,
|
|
68
|
+
eventSeq,
|
|
69
|
+
currentAssistantMessageId: messageId,
|
|
70
|
+
evidenceSeq: state.evidenceSeq ?? eventSeq,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function handleMainSessionIdle({ store, }) {
|
|
75
|
+
const state = store.getState();
|
|
76
|
+
const idleSeq = state.eventSeq + 1;
|
|
77
|
+
if (state.phase !== 'prompt-resolved') {
|
|
78
|
+
store.setState((current) => {
|
|
79
|
+
return {
|
|
80
|
+
...current,
|
|
81
|
+
eventSeq: idleSeq,
|
|
82
|
+
idleState: 'deferred',
|
|
83
|
+
deferredIdleSeq: idleSeq,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
return 'deferred';
|
|
87
|
+
}
|
|
88
|
+
if (!state.currentAssistantMessageId) {
|
|
89
|
+
store.setState((current) => {
|
|
90
|
+
return {
|
|
91
|
+
...current,
|
|
92
|
+
eventSeq: idleSeq,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
return 'ignore-no-evidence';
|
|
96
|
+
}
|
|
97
|
+
store.setState((current) => {
|
|
98
|
+
return {
|
|
99
|
+
...current,
|
|
100
|
+
eventSeq: idleSeq,
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
return 'process';
|
|
104
|
+
}
|
|
105
|
+
export function markPromptResolvedAndConsumeDeferredIdle({ store, }) {
|
|
106
|
+
const state = store.getState();
|
|
107
|
+
const nextState = {
|
|
108
|
+
...state,
|
|
109
|
+
phase: 'prompt-resolved',
|
|
110
|
+
};
|
|
111
|
+
if (state.idleState !== 'deferred') {
|
|
112
|
+
store.setState(nextState);
|
|
113
|
+
return 'none';
|
|
114
|
+
}
|
|
115
|
+
nextState.idleState = 'none';
|
|
116
|
+
nextState.deferredIdleSeq = undefined;
|
|
117
|
+
if (!state.currentAssistantMessageId) {
|
|
118
|
+
store.setState(nextState);
|
|
119
|
+
return 'ignore-no-evidence';
|
|
120
|
+
}
|
|
121
|
+
if (typeof state.deferredIdleSeq === 'number' &&
|
|
122
|
+
typeof state.evidenceSeq === 'number' &&
|
|
123
|
+
state.deferredIdleSeq <= state.evidenceSeq) {
|
|
124
|
+
store.setState(nextState);
|
|
125
|
+
return 'ignore-before-evidence';
|
|
126
|
+
}
|
|
127
|
+
store.setState(nextState);
|
|
128
|
+
return 'process';
|
|
129
|
+
}
|
|
130
|
+
export function markFinished({ store }) {
|
|
131
|
+
store.setState((state) => {
|
|
132
|
+
return {
|
|
133
|
+
...state,
|
|
134
|
+
phase: 'finished',
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export function markAborted({ store }) {
|
|
139
|
+
store.setState((state) => {
|
|
140
|
+
if (state.phase === 'finished') {
|
|
141
|
+
return state;
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
...state,
|
|
145
|
+
phase: 'aborted',
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
export function hasCurrentPromptEvidence({ store, }) {
|
|
150
|
+
return Boolean(store.getState().currentAssistantMessageId);
|
|
151
|
+
}
|