oysterun 1.6.0-beta.1 → 1.6.0-beta.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.
- package/host-service/callback-durable-store.mjs +2 -2
- package/host-service/completed-turn-navigation.mjs +31 -11
- package/host-service/package.json +1 -1
- package/host-service/routec-matrix-sqlite-store.mjs +10 -38
- package/host-service/routec-matrix-storage-adapter.mjs +2 -2
- package/host-service/server.mjs +16 -10
- package/package.json +1 -1
- package/static/site/blog/generated_manifest.json +2 -2
- package/static/site/docs/choose-and-recover-a-provider/en/index.html +17 -12
- package/static/site/docs/choose-and-recover-a-provider/en/index.md +28 -20
- package/static/site/docs/choose-and-recover-a-provider/zh/index.html +17 -12
- package/static/site/docs/choose-and-recover-a-provider/zh/index.md +26 -18
- package/static/site/docs/configure-session-files-and-settings/en/index.html +1 -1
- package/static/site/docs/configure-session-files-and-settings/zh/index.html +1 -1
- package/static/site/docs/en/index.html +2 -2
- package/static/site/docs/en/index.md +1 -1
- package/static/site/docs/generated_manifest.json +60 -60
- package/static/site/docs/host-authentication-and-connection/en/index.html +1 -1
- package/static/site/docs/host-authentication-and-connection/zh/index.html +1 -1
- package/static/site/docs/install-and-use-a-skill/en/index.html +1 -1
- package/static/site/docs/install-and-use-a-skill/zh/index.html +1 -1
- package/static/site/docs/llms.txt +2 -2
- package/static/site/docs/read-large-tool-results/en/index.html +1 -1
- package/static/site/docs/read-large-tool-results/zh/index.html +1 -1
- package/static/site/docs/recover-from-a-host-runtime-error/en/index.html +1 -1
- package/static/site/docs/recover-from-a-host-runtime-error/zh/index.html +1 -1
- package/static/site/docs/restore-work-after-a-host-restart/en/index.html +1 -1
- package/static/site/docs/restore-work-after-a-host-restart/zh/index.html +1 -1
- package/static/site/docs/search-index.json +2 -2
- package/static/site/docs/send-images-and-media/en/index.html +1 -1
- package/static/site/docs/send-images-and-media/zh/index.html +1 -1
- package/static/site/docs/set-up-and-understand-a-host/en/index.html +6 -6
- package/static/site/docs/set-up-and-understand-a-host/en/index.md +5 -5
- package/static/site/docs/set-up-and-understand-a-host/zh/index.html +6 -6
- package/static/site/docs/set-up-and-understand-a-host/zh/index.md +5 -5
- package/static/site/docs/understand-agent-activity/en/index.html +1 -1
- package/static/site/docs/understand-agent-activity/zh/index.html +1 -1
- package/static/site/docs/use-the-oysterun-cli-safely/en/index.html +1 -1
- package/static/site/docs/use-the-oysterun-cli-safely/zh/index.html +1 -1
- package/static/site/docs/zh/index.html +2 -2
- package/static/site/docs/zh/index.md +1 -1
- package/static/site/en/index.html +3 -13
- package/static/site/en/index.md +4 -14
- package/static/site/getting-started/en/index.html +2 -22
- package/static/site/getting-started/en/index.md +3 -23
- package/static/site/getting-started/zh/index.html +2 -22
- package/static/site/getting-started/zh/index.md +3 -23
- package/static/site/install.sh +32 -9
- package/static/site/overview/en/index.html +3 -13
- package/static/site/overview/en/index.md +3 -13
- package/static/site/overview/zh/index.html +3 -13
- package/static/site/overview/zh/index.md +3 -13
- package/static/site/zh/index.html +3 -13
- package/static/site/zh/index.md +4 -14
- package/static/site_source/content/tutorials/published/choose-and-recover-a-provider/content.json +2 -2
- package/static/site_source/content/tutorials/published/choose-and-recover-a-provider/en/article.html +12 -8
- package/static/site_source/content/tutorials/published/choose-and-recover-a-provider/zh/article.html +12 -8
- package/static/site_source/content/tutorials/published/set-up-and-understand-a-host/en/article.html +5 -5
- package/static/site_source/content/tutorials/published/set-up-and-understand-a-host/zh/article.html +5 -5
- package/static/site_source/downloads/install.sh +32 -9
- package/static/site_source/manifests/host_install.json +2 -2
- package/static/site_source/pages/getting-started/en.html +1 -1
- package/static/site_source/pages/getting-started/zh.html +1 -1
- package/static/site_source/pages/home/en.html +2 -2
- package/static/site_source/pages/home/zh.html +2 -2
- package/static/site_source/pages/home_main.html +16 -18
- package/static/site_source/pages/home_scripts.html +21 -21
- package/static/site_source/pages/overview/en.html +2 -2
- package/static/site_source/pages/overview/zh.html +2 -2
|
@@ -438,7 +438,7 @@ export function openDurableCallbackStore(db, {
|
|
|
438
438
|
}
|
|
439
439
|
const candidates = db
|
|
440
440
|
.prepare(
|
|
441
|
-
`SELECT * FROM matrix_events
|
|
441
|
+
`SELECT * FROM matrix_events
|
|
442
442
|
WHERE room_id = @room_id AND is_state = 0 AND type = 'm.room.message'
|
|
443
443
|
AND semantic_type IN ('message.assistant', 'tool.result', 'tool.failure', 'thinking.reasoning')
|
|
444
444
|
AND json_extract(content_json, '$."org.oysterun.semantic.v1".provider_turn_id') = @turn_id
|
|
@@ -449,7 +449,7 @@ export function openDurableCallbackStore(db, {
|
|
|
449
449
|
.all({ room_id: record.target_matrix_room_id, turn_id: record.target_provider_turn_id });
|
|
450
450
|
const completions = db
|
|
451
451
|
.prepare(
|
|
452
|
-
`SELECT * FROM matrix_events
|
|
452
|
+
`SELECT * FROM matrix_events
|
|
453
453
|
WHERE room_id = @room_id AND is_state = 0 AND type = 'm.room.message'
|
|
454
454
|
AND json_extract(content_json, '$."org.oysterun.semantic.v1".provider_completion_turn_id') = @turn_id
|
|
455
455
|
AND json_extract(content_json, '$."org.oysterun.semantic.v1".provider_completion_marker') = 'oysterun_provider_complete_message_notification_v1'
|
|
@@ -182,14 +182,14 @@ function selectorSql(direction) {
|
|
|
182
182
|
SELECT
|
|
183
183
|
json_extract(c.content_json, '$."org.oysterun.semantic.v1".provider_turn_id') AS provider_turn_id,
|
|
184
184
|
MAX(c.stream_seq) AS final_seq
|
|
185
|
-
FROM matrix_events AS c
|
|
185
|
+
FROM matrix_events AS c
|
|
186
186
|
WHERE ${CANDIDATE_WHERE}
|
|
187
187
|
GROUP BY provider_turn_id
|
|
188
188
|
), successful_turns AS (
|
|
189
189
|
SELECT
|
|
190
190
|
json_extract(m.content_json, '$."org.oysterun.semantic.v1".provider_completion_turn_id') AS provider_turn_id,
|
|
191
191
|
MAX(m.stream_seq) AS completion_seq
|
|
192
|
-
FROM matrix_events AS m
|
|
192
|
+
FROM matrix_events AS m
|
|
193
193
|
WHERE ${COMPLETION_WHERE}
|
|
194
194
|
GROUP BY provider_turn_id
|
|
195
195
|
)
|
|
@@ -268,14 +268,14 @@ function exactTargetSql() {
|
|
|
268
268
|
SELECT
|
|
269
269
|
json_extract(c.content_json, '$."org.oysterun.semantic.v1".provider_turn_id') AS provider_turn_id,
|
|
270
270
|
MAX(c.stream_seq) AS final_seq
|
|
271
|
-
FROM matrix_events AS c
|
|
271
|
+
FROM matrix_events AS c
|
|
272
272
|
WHERE ${CANDIDATE_WHERE}
|
|
273
273
|
GROUP BY provider_turn_id
|
|
274
274
|
), successful_turns AS (
|
|
275
275
|
SELECT
|
|
276
276
|
json_extract(m.content_json, '$."org.oysterun.semantic.v1".provider_completion_turn_id') AS provider_turn_id,
|
|
277
277
|
MAX(m.stream_seq) AS completion_seq
|
|
278
|
-
FROM matrix_events AS m
|
|
278
|
+
FROM matrix_events AS m
|
|
279
279
|
WHERE ${COMPLETION_WHERE}
|
|
280
280
|
GROUP BY provider_turn_id
|
|
281
281
|
)
|
|
@@ -425,6 +425,18 @@ export function readCompletedTurnFinalMessageNeighborsFromSQLite(
|
|
|
425
425
|
});
|
|
426
426
|
const noCompletedTurns = latestCompleted === null;
|
|
427
427
|
|
|
428
|
+
const navigationIndexesPresent = [
|
|
429
|
+
MATRIX_COMPLETED_TURN_CANDIDATE_INDEX,
|
|
430
|
+
MATRIX_COMPLETED_TURN_COMPLETION_INDEX,
|
|
431
|
+
].every(
|
|
432
|
+
(name) =>
|
|
433
|
+
db
|
|
434
|
+
.prepare(
|
|
435
|
+
"SELECT 1 AS present FROM sqlite_master WHERE type = 'index' AND name = ?"
|
|
436
|
+
)
|
|
437
|
+
.get(name)?.present === 1
|
|
438
|
+
);
|
|
439
|
+
|
|
428
440
|
return {
|
|
429
441
|
status: "ok",
|
|
430
442
|
session_id: hostSessionId,
|
|
@@ -449,16 +461,24 @@ export function readCompletedTurnFinalMessageNeighborsFromSQLite(
|
|
|
449
461
|
},
|
|
450
462
|
proof: {
|
|
451
463
|
schema_version: NAVIGATION_SCHEMA_VERSION,
|
|
452
|
-
lookup_source:
|
|
453
|
-
|
|
464
|
+
lookup_source: navigationIndexesPresent
|
|
465
|
+
? "routec_matrix_events_completed_turn_expression_indexes"
|
|
466
|
+
: "routec_matrix_events_completed_turn_sql",
|
|
467
|
+
lookup_strategy: navigationIndexesPresent
|
|
468
|
+
? "indexed_completed_turn_final_message"
|
|
469
|
+
: "unindexed_completed_turn_final_message",
|
|
454
470
|
order_by: "final_candidate_stream_seq",
|
|
455
471
|
candidate_predicate: "complete_message_notification_candidate",
|
|
456
472
|
completion_predicate: "complete_message_notification_completion",
|
|
457
|
-
navigation_index_version:
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
473
|
+
navigation_index_version: navigationIndexesPresent
|
|
474
|
+
? MATRIX_COMPLETED_TURN_NAVIGATION_INDEX_VERSION
|
|
475
|
+
: null,
|
|
476
|
+
navigation_index_names: navigationIndexesPresent
|
|
477
|
+
? [
|
|
478
|
+
MATRIX_COMPLETED_TURN_CANDIDATE_INDEX,
|
|
479
|
+
MATRIX_COMPLETED_TURN_COMPLETION_INDEX,
|
|
480
|
+
]
|
|
481
|
+
: [],
|
|
462
482
|
raw_event_scan_limit: null,
|
|
463
483
|
raw_event_payload_returned: false,
|
|
464
484
|
message_body_returned: false,
|
|
@@ -751,14 +751,6 @@ export function ensureCallbackSchemaMigration(db) {
|
|
|
751
751
|
};
|
|
752
752
|
}
|
|
753
753
|
|
|
754
|
-
function assertCompletedTurnNavigationIndexesReady(db) {
|
|
755
|
-
if (!completedTurnNavigationIndexesReady(db)) {
|
|
756
|
-
throw new Error(
|
|
757
|
-
"Route C Matrix SQLite completed-turn navigation index migration is required"
|
|
758
|
-
);
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
|
|
762
754
|
function latestStreamSeqForMaintenance(db) {
|
|
763
755
|
const row = db
|
|
764
756
|
.prepare(
|
|
@@ -937,8 +929,6 @@ function openDatabase(
|
|
|
937
929
|
}
|
|
938
930
|
if (migrateCompletedTurnNavigation) {
|
|
939
931
|
ensureCompletedTurnNavigationIndexMigration(db);
|
|
940
|
-
} else {
|
|
941
|
-
assertCompletedTurnNavigationIndexesReady(db);
|
|
942
932
|
}
|
|
943
933
|
return db;
|
|
944
934
|
} catch (err) {
|
|
@@ -1807,7 +1797,6 @@ function migrateJsonToSQLite({ jsonStoragePath, sqlitePath }) {
|
|
|
1807
1797
|
importLegacyJsonSnapshotIntoSQLiteStreaming(db, jsonStoragePath);
|
|
1808
1798
|
const deltaRecordCount = applyDeltaJsonlToSQLiteStreaming(db, deltaPath);
|
|
1809
1799
|
ensureStreamSeqAuthorityMigration(db);
|
|
1810
|
-
ensureCompletedTurnNavigationIndexMigration(db);
|
|
1811
1800
|
const sourceAfter = fileSignature(jsonStoragePath);
|
|
1812
1801
|
const deltaAfter = fileSignature(deltaPath);
|
|
1813
1802
|
if (
|
|
@@ -1980,26 +1969,7 @@ function inspectStreamSeqAuthorityReadiness(sqlitePath) {
|
|
|
1980
1969
|
};
|
|
1981
1970
|
}
|
|
1982
1971
|
const navigationIndexVersion = completedTurnNavigationIndexVersion(db);
|
|
1983
|
-
|
|
1984
|
-
return {
|
|
1985
|
-
storage_ready: false,
|
|
1986
|
-
migration_status: "completed_turn_navigation_index_migration_required",
|
|
1987
|
-
unique_index_ready: true,
|
|
1988
|
-
unique_index_name: MATRIX_STREAM_SEQ_UNIQUE_INDEX,
|
|
1989
|
-
unique_index_version: MATRIX_STREAM_SEQ_INDEX_VERSION,
|
|
1990
|
-
navigation_indexes_ready: false,
|
|
1991
|
-
navigation_index_version: Number.isSafeInteger(navigationIndexVersion)
|
|
1992
|
-
? navigationIndexVersion
|
|
1993
|
-
: null,
|
|
1994
|
-
navigation_index_names: [
|
|
1995
|
-
MATRIX_COMPLETED_TURN_CANDIDATE_INDEX,
|
|
1996
|
-
MATRIX_COMPLETED_TURN_COMPLETION_INDEX,
|
|
1997
|
-
],
|
|
1998
|
-
next_stream_seq: null,
|
|
1999
|
-
startup_validation_status: "not_run",
|
|
2000
|
-
startup_repair: readStartupRepairSummary(db),
|
|
2001
|
-
};
|
|
2002
|
-
}
|
|
1972
|
+
const navigationIndexesReady = completedTurnNavigationIndexesReady(db);
|
|
2003
1973
|
const latestStreamSeq = latestStreamSeqForMaintenance(db);
|
|
2004
1974
|
const raw = db
|
|
2005
1975
|
.prepare("SELECT value FROM matrix_schema_meta WHERE key = ?")
|
|
@@ -2025,8 +1995,10 @@ function inspectStreamSeqAuthorityReadiness(sqlitePath) {
|
|
|
2025
1995
|
unique_index_ready: true,
|
|
2026
1996
|
unique_index_name: MATRIX_STREAM_SEQ_UNIQUE_INDEX,
|
|
2027
1997
|
unique_index_version: MATRIX_STREAM_SEQ_INDEX_VERSION,
|
|
2028
|
-
navigation_indexes_ready:
|
|
2029
|
-
navigation_index_version:
|
|
1998
|
+
navigation_indexes_ready: navigationIndexesReady,
|
|
1999
|
+
navigation_index_version: Number.isSafeInteger(navigationIndexVersion)
|
|
2000
|
+
? navigationIndexVersion
|
|
2001
|
+
: null,
|
|
2030
2002
|
navigation_index_names: [
|
|
2031
2003
|
MATRIX_COMPLETED_TURN_CANDIDATE_INDEX,
|
|
2032
2004
|
MATRIX_COMPLETED_TURN_COMPLETION_INDEX,
|
|
@@ -2135,7 +2107,6 @@ export function openRouteCMatrixSQLiteStore({ jsonStoragePath }) {
|
|
|
2135
2107
|
if (!existsSync(sqlitePath)) {
|
|
2136
2108
|
const db = openDatabase(sqlitePath, {
|
|
2137
2109
|
migrateStreamSeqAuthority: true,
|
|
2138
|
-
migrateCompletedTurnNavigation: true,
|
|
2139
2110
|
});
|
|
2140
2111
|
const counts = storeCounts(db);
|
|
2141
2112
|
writeProof(
|
|
@@ -2901,7 +2872,6 @@ export function getRouteCMatrixSQLiteStorageHealth({
|
|
|
2901
2872
|
if (!readiness.storage_ready && migrateIfNeeded) {
|
|
2902
2873
|
const migrationDb = openDatabase(sqlitePath, {
|
|
2903
2874
|
migrateStreamSeqAuthority: true,
|
|
2904
|
-
migrateCompletedTurnNavigation: true,
|
|
2905
2875
|
});
|
|
2906
2876
|
migrationDb.close();
|
|
2907
2877
|
}
|
|
@@ -2924,9 +2894,11 @@ export function getRouteCMatrixSQLiteStorageHealth({
|
|
|
2924
2894
|
legacy_json_preserved: existsSync(jsonStoragePath),
|
|
2925
2895
|
legacy_delta_preserved: existsSync(`${jsonStoragePath}.delta.jsonl`),
|
|
2926
2896
|
migration_status:
|
|
2927
|
-
|
|
2928
|
-
?
|
|
2929
|
-
: migrationProof?.status
|
|
2897
|
+
readiness.navigation_indexes_ready !== true
|
|
2898
|
+
? "validated_existing_sqlite_navigation_indexes_optional_absent"
|
|
2899
|
+
: migrationProof?.status === "failed"
|
|
2900
|
+
? readiness.migration_status
|
|
2901
|
+
: migrationProof?.status || readiness.migration_status,
|
|
2930
2902
|
migration_proof_path: proofPath,
|
|
2931
2903
|
migration_proof_summary: migrationProof
|
|
2932
2904
|
? {
|
|
@@ -1427,7 +1427,7 @@ export function ensureRouteCMatrixStorageReadyBeforeHostListen() {
|
|
|
1427
1427
|
jsonStoragePath: storagePath,
|
|
1428
1428
|
migrateIfNeeded: true,
|
|
1429
1429
|
});
|
|
1430
|
-
if (health.storage_ready !== true
|
|
1430
|
+
if (health.storage_ready !== true) {
|
|
1431
1431
|
throw new Error(
|
|
1432
1432
|
`Route C Matrix storage is not ready before Host listen: ${health.migration_status || "unknown"}`
|
|
1433
1433
|
);
|
|
@@ -1436,7 +1436,7 @@ export function ensureRouteCMatrixStorageReadyBeforeHostListen() {
|
|
|
1436
1436
|
status: "ready",
|
|
1437
1437
|
storage_path: storagePath,
|
|
1438
1438
|
sqlite_storage_path: health.sqlite_storage_path,
|
|
1439
|
-
navigation_indexes_ready: true,
|
|
1439
|
+
navigation_indexes_ready: health.navigation_indexes_ready === true,
|
|
1440
1440
|
navigation_index_version: health.navigation_index_version,
|
|
1441
1441
|
duration_ms: Date.now() - startedAtMs,
|
|
1442
1442
|
};
|
package/host-service/server.mjs
CHANGED
|
@@ -3616,9 +3616,15 @@ routeCMatrixFacade = createRouteCMatrixFacade({
|
|
|
3616
3616
|
}
|
|
3617
3617
|
},
|
|
3618
3618
|
});
|
|
3619
|
-
|
|
3620
|
-
|
|
3621
|
-
|
|
3619
|
+
// Matrix storage must be bootstrapped before the first consumer opens it. Keep
|
|
3620
|
+
// this ahead of callback, unread, notification, and request-serving setup so a
|
|
3621
|
+
// newly added module-level consumer cannot bypass storage readiness.
|
|
3622
|
+
const STARTUP_MATRIX_STORAGE_READINESS =
|
|
3623
|
+
ensureRouteCMatrixStorageReadyBeforeHostListen();
|
|
3624
|
+
const STARTUP_MATRIX_STORAGE = openRouteCMatrixSQLiteStore({
|
|
3625
|
+
jsonStoragePath: getRouteCMatrixStoragePath(),
|
|
3626
|
+
});
|
|
3627
|
+
const callbackStore = openDurableCallbackStore(STARTUP_MATRIX_STORAGE);
|
|
3622
3628
|
callbackHostIntegration = createCallbackHostIntegration({
|
|
3623
3629
|
store: callbackStore,
|
|
3624
3630
|
getSession: (sessionId) => sessionManager.getSession(sessionId),
|
|
@@ -24962,18 +24968,18 @@ const STARTUP_NODE_NPM_LIFECYCLE_TOOLCHAIN = (() => {
|
|
|
24962
24968
|
}
|
|
24963
24969
|
})();
|
|
24964
24970
|
|
|
24965
|
-
const
|
|
24966
|
-
const readiness = ensureRouteCMatrixStorageReadyBeforeHostListen();
|
|
24971
|
+
const STARTUP_MATRIX_CONSUMER_READINESS = (() => {
|
|
24967
24972
|
const unreadReadiness = ensureCompletedSessionUnreadSchema(
|
|
24968
|
-
|
|
24969
|
-
jsonStoragePath: getRouteCMatrixStoragePath(),
|
|
24970
|
-
}),
|
|
24973
|
+
STARTUP_MATRIX_STORAGE,
|
|
24971
24974
|
{ hostUserId: HOST_OWNER_READ_CURSOR_USER_ID }
|
|
24972
24975
|
);
|
|
24973
24976
|
console.log(
|
|
24974
|
-
`[oysterun-host] Matrix SQLite readiness complete before
|
|
24977
|
+
`[oysterun-host] Matrix SQLite readiness complete before consumers (${STARTUP_MATRIX_STORAGE_READINESS.duration_ms}ms; P214 ${unreadReadiness.duration_ms}ms)`
|
|
24975
24978
|
);
|
|
24976
|
-
return {
|
|
24979
|
+
return {
|
|
24980
|
+
...STARTUP_MATRIX_STORAGE_READINESS,
|
|
24981
|
+
completed_session_unread: unreadReadiness,
|
|
24982
|
+
};
|
|
24977
24983
|
})();
|
|
24978
24984
|
|
|
24979
24985
|
server.listen(PORT, () => {
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema": "oysterun.static_blog_manifest.v3",
|
|
3
3
|
"content_schema": "oysterun.static_content_bundle.v2",
|
|
4
4
|
"shell_schema": "oysterun.static_site_shell.v3",
|
|
5
|
-
"shell_sha256": "
|
|
5
|
+
"shell_sha256": "1b499d9ab1382144b285cf0dc75c00da0d3e3095aed750a0110025be3f93caa3",
|
|
6
6
|
"generated_slugs": [
|
|
7
7
|
"voice-input-model-experiment"
|
|
8
8
|
],
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"type": "svg"
|
|
33
33
|
},
|
|
34
34
|
"content_sha256": "49a68eec9d4d83126308962f646d673dacd526b867b2d3818b834c06a893e1a9",
|
|
35
|
-
"shell_sha256": "
|
|
35
|
+
"shell_sha256": "1b499d9ab1382144b285cf0dc75c00da0d3e3095aed750a0110025be3f93caa3",
|
|
36
36
|
"files": [
|
|
37
37
|
{
|
|
38
38
|
"path": "en/index.html",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>Choose and recover an Oysterun provider</title>
|
|
7
|
-
<meta name="description" content="Choose Claude or
|
|
7
|
+
<meta name="description" content="Choose Codex, Claude, or Grok in Session Setup, separate dashboard access from provider login, and follow one bounded recovery path when its command or login is unavailable." />
|
|
8
8
|
<meta name="robots" content="index,follow" />
|
|
9
9
|
<link rel="icon" href="/assets/oysterun_logo_v5.PNG" type="image/png" />
|
|
10
10
|
<link rel="stylesheet" href="/assets/site.css" />
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
</details>
|
|
71
71
|
<details class="docs-task-group" open id="docs-group-sessions-providers">
|
|
72
72
|
<summary>Sessions and providers</summary>
|
|
73
|
-
<ul><li><a href="/docs/configure-session-files-and-settings/en/index.html" data-doc-search-text="choose a session folder and control which settings are saved choose a focused start folder, preserve your setup draft when canceling or confirming the folder picker, and decide whether session settings apply once or persist with the project. sessions and providers">Choose a Session folder and control which settings are saved</a></li><li><a href="/docs/choose-and-recover-a-provider/en/index.html" aria-current="page" data-doc-search-text="choose and recover an oysterun provider choose claude or
|
|
73
|
+
<ul><li><a href="/docs/configure-session-files-and-settings/en/index.html" data-doc-search-text="choose a session folder and control which settings are saved choose a focused start folder, preserve your setup draft when canceling or confirming the folder picker, and decide whether session settings apply once or persist with the project. sessions and providers">Choose a Session folder and control which settings are saved</a></li><li><a href="/docs/choose-and-recover-a-provider/en/index.html" aria-current="page" data-doc-search-text="choose and recover an oysterun provider choose codex, claude, or grok in session setup, separate dashboard access from provider login, and follow one bounded recovery path when its command or login is unavailable. sessions and providers">Choose and recover an Oysterun provider</a></li><li><a href="/docs/understand-agent-activity/en/index.html" data-doc-search-text="how to tell whether an oysterun agent is working or idle send one safe message from the sessions page and distinguish available, occupied, working, terminal, and unknown states without duplicate work. sessions and providers">How to tell whether an Oysterun agent is working or idle</a></li></ul>
|
|
74
74
|
</details>
|
|
75
75
|
<details class="docs-task-group" open id="docs-group-chat-messages-files">
|
|
76
76
|
<summary>Chat, messages, and files</summary>
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
<header class="article-title-block">
|
|
96
96
|
<p class="eyebrow">Docs</p>
|
|
97
97
|
<h1 id="article-title">Choose and recover an Oysterun provider</h1>
|
|
98
|
-
<p class="article-description">Choose Claude or
|
|
98
|
+
<p class="article-description">Choose Codex, Claude, or Grok in Session Setup, separate dashboard access from provider login, and follow one bounded recovery path when its command or login is unavailable.</p>
|
|
99
99
|
<p class="article-date"><time datetime="2026-08-27">2026-08-27</time></p>
|
|
100
100
|
</header>
|
|
101
101
|
|
|
@@ -109,9 +109,10 @@
|
|
|
109
109
|
<strong>On this page</strong>
|
|
110
110
|
<ol><li class="article-toc-level-1 article-toc-top"><a href="#article-title" data-article-toc-link data-article-toc-target="article-title" aria-current="location">Article start</a></li>
|
|
111
111
|
<li class="article-toc-level-2"><a href="#prepare-provider" data-article-toc-link data-article-toc-target="prepare-provider">1. Start from the intended Host and folder</a></li>
|
|
112
|
-
<li class="article-toc-level-2"><a href="#choose-runtime" data-article-toc-link data-article-toc-target="choose-runtime">2. Choose Claude or
|
|
112
|
+
<li class="article-toc-level-2"><a href="#choose-runtime" data-article-toc-link data-article-toc-target="choose-runtime">2. Choose Codex, Claude, or Grok in Session Setup</a></li>
|
|
113
113
|
<li class="article-toc-level-3"><a href="#claude-controls" data-article-toc-link data-article-toc-target="claude-controls">Claude</a></li>
|
|
114
114
|
<li class="article-toc-level-3"><a href="#codex-controls" data-article-toc-link data-article-toc-target="codex-controls">Codex</a></li>
|
|
115
|
+
<li class="article-toc-level-3"><a href="#grok-controls" data-article-toc-link data-article-toc-target="grok-controls">Grok</a></li>
|
|
115
116
|
<li class="article-toc-level-2"><a href="#refresh-catalog" data-article-toc-link data-article-toc-target="refresh-catalog">3. Refresh the selected catalog once when needed</a></li>
|
|
116
117
|
<li class="article-toc-level-2"><a href="#prove-ready" data-article-toc-link data-article-toc-target="prove-ready">4. Prove runtime readiness with one Session</a></li>
|
|
117
118
|
<li class="article-toc-level-2"><a href="#recover-command" data-article-toc-link data-article-toc-target="recover-command">5. Recover an unavailable runtime without hiding it</a></li>
|
|
@@ -133,8 +134,8 @@
|
|
|
133
134
|
<section aria-labelledby="prepare-provider">
|
|
134
135
|
<h2 id="prepare-provider">1. Start from the intended Host and folder</h2>
|
|
135
136
|
<ul>
|
|
136
|
-
<li>Open the intended Oysterun Host and reach <strong>Sessions</strong>. Entering the Host dashboard password unlocks Oysterun only; it does not sign Claude or
|
|
137
|
-
<li>Confirm that the intended Claude Code or
|
|
137
|
+
<li>Open the intended Oysterun Host and reach <strong>Sessions</strong>. Entering the Host dashboard password unlocks Oysterun only; it does not sign Codex, Claude Code, or Grok in.</li>
|
|
138
|
+
<li>Confirm that the intended Codex, Claude Code, or Grok command resolves for the same operating-system user that runs the Host. An installation owned only by another user does not make that runtime available here.</li>
|
|
138
139
|
<li>Know which <strong>Start Folder</strong> the new Session should use. Provider readiness is checked for the Session you are about to create, not for a different Host or folder.</li>
|
|
139
140
|
</ul>
|
|
140
141
|
<aside class="safety-note">
|
|
@@ -143,11 +144,11 @@
|
|
|
143
144
|
</section>
|
|
144
145
|
|
|
145
146
|
<section aria-labelledby="choose-runtime">
|
|
146
|
-
<h2 id="choose-runtime">2. Choose Claude or
|
|
147
|
+
<h2 id="choose-runtime">2. Choose Codex, Claude, or Grok in Session Setup</h2>
|
|
147
148
|
<ol>
|
|
148
149
|
<li>From <strong>Sessions</strong>, choose <strong>New Session</strong>.</li>
|
|
149
150
|
<li>In <strong>Session Setup</strong>, find <strong>Provider Runtime</strong>, then <strong>Agent Runtime</strong>.</li>
|
|
150
|
-
<li>Choose <strong>Claude</strong
|
|
151
|
+
<li>Choose <strong>Codex</strong>, <strong>Claude</strong>, or <strong>Grok</strong>. Oysterun shows only runtimes whose saved command is currently available on this Host. A missing runtime is not currently offered by that Host.</li>
|
|
151
152
|
<li>Read the visible <strong>Model</strong>, <strong>Reasoning Effort</strong>, and provider-specific fixed control before continuing.</li>
|
|
152
153
|
</ol>
|
|
153
154
|
|
|
@@ -160,9 +161,13 @@
|
|
|
160
161
|
<h3 id="codex-controls">Codex</h3>
|
|
161
162
|
<p>Codex uses <strong>Approval Style</strong>. In normal Oysterun Sessions it is disabled intentionally and says <strong>Fixed for Oysterun Sessions.</strong> Codex has no <code>auto</code> reasoning choice. Oysterun displays the product label <code>max</code> when the selected Codex model supports native <code>xhigh</code>.</p>
|
|
162
163
|
</article>
|
|
164
|
+
<article class="provider-card grok-card">
|
|
165
|
+
<h3 id="grok-controls">Grok</h3>
|
|
166
|
+
<p>Grok requires the official CLI version <strong>1.0.25 or newer</strong>. Its Model and Reasoning Effort choices come from structured provider metadata; update the CLI if Oysterun reports an older or unverifiable version.</p>
|
|
167
|
+
</article>
|
|
163
168
|
</div>
|
|
164
169
|
|
|
165
|
-
<p>If a saved default runtime is unavailable, Oysterun can temporarily select another available runtime for a fresh Session and says which saved provider is unavailable and which provider new Sessions will use. Treat the highlighted <strong>Claude</strong
|
|
170
|
+
<p>If a saved default runtime is unavailable, Oysterun can temporarily select another available runtime for a fresh Session and says which saved provider is unavailable and which provider new Sessions will use. Treat the highlighted <strong>Codex</strong>, <strong>Claude</strong>, or <strong>Grok</strong> button—not the old default—as the current choice. Switching providers is a deliberate new choice: recheck Model and Reasoning Effort before starting.</p>
|
|
166
171
|
</section>
|
|
167
172
|
|
|
168
173
|
<section aria-labelledby="refresh-catalog">
|
|
@@ -209,8 +214,8 @@
|
|
|
209
214
|
|
|
210
215
|
<ol>
|
|
211
216
|
<li>Open the Oysterun menu and choose <strong>Host Preferences</strong>.</li>
|
|
212
|
-
<li>Find <strong>Claude
|
|
213
|
-
<li>Read
|
|
217
|
+
<li>Find the intended <strong>Codex</strong>, <strong>Claude</strong>, or <strong>Grok Runtime Defaults</strong>.</li>
|
|
218
|
+
<li>Read the matching provider command. A blank field disables that runtime explicitly. An available command says <strong>Available on this Host.</strong>; an unresolved one says <strong>Unavailable on this Host.</strong></li>
|
|
214
219
|
<li>Fix the provider installation or executable path for the Host's operating-system user. If you change the command field, choose <strong>Save</strong>, then return to Session Setup.</li>
|
|
215
220
|
<li>Select the runtime, refresh its models once, and continue only after a success status and valid Model/Reasoning Effort choices are visible.</li>
|
|
216
221
|
</ol>
|
|
@@ -229,7 +234,7 @@
|
|
|
229
234
|
|
|
230
235
|
<ol>
|
|
231
236
|
<li>Use the machine terminal. If it is not otherwise available, choose the <strong>Open Terminal</strong> link in the visible system row.</li>
|
|
232
|
-
<li>For Codex, run <code>codex /login</code>. For Claude, run <code>claude /login</code>.</li>
|
|
237
|
+
<li>For Codex, run <code>codex /login</code>. For Claude, run <code>claude /login</code>. For Grok, run <code>grok login</code>.</li>
|
|
233
238
|
<li>Finish the provider-owned browser or terminal login without capturing its URL, code, token, or output as public evidence.</li>
|
|
234
239
|
<li>Return to the same affected Chat. The system row calls for <strong>Restart session</strong>; use <strong>More Options</strong> (vertical ellipsis) → <strong>Restart</strong>. This restarts only that provider Session; it is not permission to restart the Oysterun Host.</li>
|
|
235
240
|
<li>Send one short non-sensitive message. A normal response is the recovery verdict.</li>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Choose and recover an Oysterun provider
|
|
2
2
|
|
|
3
|
-
Choose Claude or
|
|
3
|
+
Choose Codex, Claude, or Grok in Session Setup, separate dashboard access from provider login, and follow one bounded recovery path when its command or login is unavailable.
|
|
4
4
|
|
|
5
5
|
Choose the agent runtime that should own a new Session, keep Oysterun dashboard access separate from provider login, and prove that the selected provider can answer now instead of treating an installed command or loaded model list as readiness.
|
|
6
6
|
|
|
@@ -32,8 +32,8 @@ reaches Chat; and a short message receives a response from that Session. A refre
|
|
|
32
32
|
|
|
33
33
|
Sessions
|
|
34
34
|
|
|
35
|
-
. Entering the Host dashboard password unlocks Oysterun only; it does not sign Claude or
|
|
36
|
-
- Confirm that the intended Claude Code or
|
|
35
|
+
. Entering the Host dashboard password unlocks Oysterun only; it does not sign Codex, Claude Code, or Grok in.
|
|
36
|
+
- Confirm that the intended Codex, Claude Code, or Grok command resolves for the same operating-system user that runs the Host. An installation owned only by another user does not make that runtime available here.
|
|
37
37
|
- Know which
|
|
38
38
|
|
|
39
39
|
Start Folder
|
|
@@ -44,7 +44,7 @@ Keep secrets out of Oysterun content:
|
|
|
44
44
|
|
|
45
45
|
never paste a provider token, login code, Host password, dashboard token, or private login URL into Chat, an AgentFolder file, a support report, or a screenshot. Enter provider credentials only in the provider's supported login flow.
|
|
46
46
|
|
|
47
|
-
## 2. Choose Claude or
|
|
47
|
+
## 2. Choose Codex, Claude, or Grok in Session Setup
|
|
48
48
|
|
|
49
49
|
1. From
|
|
50
50
|
|
|
@@ -70,13 +70,17 @@ never paste a provider token, login code, Host password, dashboard token, or pri
|
|
|
70
70
|
.
|
|
71
71
|
1. Choose
|
|
72
72
|
|
|
73
|
+
Codex
|
|
74
|
+
|
|
75
|
+
,
|
|
76
|
+
|
|
73
77
|
Claude
|
|
74
78
|
|
|
75
|
-
or
|
|
79
|
+
, or
|
|
76
80
|
|
|
77
|
-
|
|
81
|
+
Grok
|
|
78
82
|
|
|
79
|
-
. Oysterun shows only runtimes whose saved command is currently available on this Host.
|
|
83
|
+
. Oysterun shows only runtimes whose saved command is currently available on this Host. A missing runtime is not currently offered by that Host.
|
|
80
84
|
1. Read the visible
|
|
81
85
|
|
|
82
86
|
Model
|
|
@@ -95,7 +99,11 @@ Claude uses **Permission Mode**. In normal Oysterun Sessions it is disabled inte
|
|
|
95
99
|
|
|
96
100
|
Codex uses **Approval Style**. In normal Oysterun Sessions it is disabled intentionally and says **Fixed for Oysterun Sessions.** Codex has no `auto` reasoning choice. Oysterun displays the product label `max` when the selected Codex model supports native `xhigh`.
|
|
97
101
|
|
|
98
|
-
|
|
102
|
+
### Grok
|
|
103
|
+
|
|
104
|
+
Grok requires the official CLI version **1.0.25 or newer**. Its Model and Reasoning Effort choices come from structured provider metadata; update the CLI if Oysterun reports an older or unverifiable version.
|
|
105
|
+
|
|
106
|
+
If a saved default runtime is unavailable, Oysterun can temporarily select another available runtime for a fresh Session and says which saved provider is unavailable and which provider new Sessions will use. Treat the highlighted **Codex**, **Claude**, or **Grok** button—not the old default—as the current choice. Switching providers is a deliberate new choice: recheck Model and Reasoning Effort before starting.
|
|
99
107
|
|
|
100
108
|
## 3. Refresh the selected catalog once when needed
|
|
101
109
|
|
|
@@ -190,24 +198,20 @@ Unavailable on this Host
|
|
|
190
198
|
Host Preferences
|
|
191
199
|
|
|
192
200
|
.
|
|
193
|
-
1. Find
|
|
194
|
-
|
|
195
|
-
Claude Runtime Defaults
|
|
196
|
-
|
|
197
|
-
or
|
|
201
|
+
1. Find the intended
|
|
198
202
|
|
|
199
|
-
Codex
|
|
203
|
+
Codex
|
|
200
204
|
|
|
201
|
-
|
|
202
|
-
1. Read
|
|
205
|
+
,
|
|
203
206
|
|
|
204
|
-
Claude
|
|
207
|
+
Claude
|
|
205
208
|
|
|
206
|
-
or
|
|
209
|
+
, or
|
|
207
210
|
|
|
208
|
-
|
|
211
|
+
Grok Runtime Defaults
|
|
209
212
|
|
|
210
|
-
.
|
|
213
|
+
.
|
|
214
|
+
1. Read the matching provider command. A blank field disables that runtime explicitly. An available command says
|
|
211
215
|
|
|
212
216
|
Available on this Host.
|
|
213
217
|
|
|
@@ -256,6 +260,10 @@ together without exposing an authentication URL, code, account, or secret.
|
|
|
256
260
|
|
|
257
261
|
claude /login
|
|
258
262
|
|
|
263
|
+
. For Grok, run
|
|
264
|
+
|
|
265
|
+
grok login
|
|
266
|
+
|
|
259
267
|
.
|
|
260
268
|
1. Finish the provider-owned browser or terminal login without capturing its URL, code, token, or output as public evidence.
|
|
261
269
|
1. Return to the same affected Chat. The system row calls for
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>選擇並恢復 Oysterun 提供者</title>
|
|
7
|
-
<meta name="description" content="在 Session Setup 選擇 Claude 或
|
|
7
|
+
<meta name="description" content="在 Session Setup 選擇 Codex、Claude 或 Grok、分清 dashboard 與提供者登入,並在命令或登入失效時走完一次有界復原。" />
|
|
8
8
|
<meta name="robots" content="index,follow" />
|
|
9
9
|
<link rel="icon" href="/assets/oysterun_logo_v5.PNG" type="image/png" />
|
|
10
10
|
<link rel="stylesheet" href="/assets/site.css" />
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
</details>
|
|
71
71
|
<details class="docs-task-group" open id="docs-group-sessions-providers">
|
|
72
72
|
<summary>Session 與提供者</summary>
|
|
73
|
-
<ul><li><a href="/docs/configure-session-files-and-settings/zh/index.html" data-doc-search-text="選擇 session 資料夾並控制設定是否儲存 選擇範圍明確的 start folder、在 folder picker 取消或確認時保留設定草稿,並判斷 session 設定只套用一次或寫入專案設定。 session 與提供者">選擇 Session 資料夾並控制設定是否儲存</a></li><li><a href="/docs/choose-and-recover-a-provider/zh/index.html" aria-current="page" data-doc-search-text="選擇並恢復 oysterun 提供者 在 session setup 選擇 claude 或
|
|
73
|
+
<ul><li><a href="/docs/configure-session-files-and-settings/zh/index.html" data-doc-search-text="選擇 session 資料夾並控制設定是否儲存 選擇範圍明確的 start folder、在 folder picker 取消或確認時保留設定草稿,並判斷 session 設定只套用一次或寫入專案設定。 session 與提供者">選擇 Session 資料夾並控制設定是否儲存</a></li><li><a href="/docs/choose-and-recover-a-provider/zh/index.html" aria-current="page" data-doc-search-text="選擇並恢復 oysterun 提供者 在 session setup 選擇 codex、claude 或 grok、分清 dashboard 與提供者登入,並在命令或登入失效時走完一次有界復原。 session 與提供者">選擇並恢復 Oysterun 提供者</a></li><li><a href="/docs/understand-agent-activity/zh/index.html" data-doc-search-text="如何判讀 oysterun agent 正在工作或已經閒置 從 sessions 頁面實際送出一則安全訊息,分辨可用、占用、工作、完成與未知狀態,避免重複派工。 session 與提供者">如何判讀 Oysterun Agent 正在工作或已經閒置</a></li></ul>
|
|
74
74
|
</details>
|
|
75
75
|
<details class="docs-task-group" open id="docs-group-chat-messages-files">
|
|
76
76
|
<summary>對話、訊息與檔案</summary>
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
<header class="article-title-block">
|
|
96
96
|
<p class="eyebrow">文件</p>
|
|
97
97
|
<h1 id="article-title">選擇並恢復 Oysterun 提供者</h1>
|
|
98
|
-
<p class="article-description">在 Session Setup 選擇 Claude 或
|
|
98
|
+
<p class="article-description">在 Session Setup 選擇 Codex、Claude 或 Grok、分清 dashboard 與提供者登入,並在命令或登入失效時走完一次有界復原。</p>
|
|
99
99
|
<p class="article-date"><time datetime="2026-08-27">2026-08-27</time></p>
|
|
100
100
|
</header>
|
|
101
101
|
|
|
@@ -109,9 +109,10 @@
|
|
|
109
109
|
<strong>本文目錄</strong>
|
|
110
110
|
<ol><li class="article-toc-level-1 article-toc-top"><a href="#article-title" data-article-toc-link data-article-toc-target="article-title" aria-current="location">文章開頭</a></li>
|
|
111
111
|
<li class="article-toc-level-2"><a href="#prepare-provider" data-article-toc-link data-article-toc-target="prepare-provider">1. 從正確的 Host 與資料夾開始</a></li>
|
|
112
|
-
<li class="article-toc-level-2"><a href="#choose-runtime" data-article-toc-link data-article-toc-target="choose-runtime">2. 在 Session Setup 選擇 Claude 或
|
|
112
|
+
<li class="article-toc-level-2"><a href="#choose-runtime" data-article-toc-link data-article-toc-target="choose-runtime">2. 在 Session Setup 選擇 Codex、Claude 或 Grok</a></li>
|
|
113
113
|
<li class="article-toc-level-3"><a href="#claude-controls" data-article-toc-link data-article-toc-target="claude-controls">Claude</a></li>
|
|
114
114
|
<li class="article-toc-level-3"><a href="#codex-controls" data-article-toc-link data-article-toc-target="codex-controls">Codex</a></li>
|
|
115
|
+
<li class="article-toc-level-3"><a href="#grok-controls" data-article-toc-link data-article-toc-target="grok-controls">Grok</a></li>
|
|
115
116
|
<li class="article-toc-level-2"><a href="#refresh-catalog" data-article-toc-link data-article-toc-target="refresh-catalog">3. 有需要時,只重新整理所選目錄一次</a></li>
|
|
116
117
|
<li class="article-toc-level-2"><a href="#prove-ready" data-article-toc-link data-article-toc-target="prove-ready">4. 用一個 Session 證明 runtime 已就緒</a></li>
|
|
117
118
|
<li class="article-toc-level-2"><a href="#recover-command" data-article-toc-link data-article-toc-target="recover-command">5. 復原不可用的 runtime,且不隱藏錯誤</a></li>
|
|
@@ -133,8 +134,8 @@
|
|
|
133
134
|
<section aria-labelledby="prepare-provider">
|
|
134
135
|
<h2 id="prepare-provider">1. 從正確的 Host 與資料夾開始</h2>
|
|
135
136
|
<ul>
|
|
136
|
-
<li>開啟預期的 Oysterun Host 並進入 <strong>Sessions</strong>。輸入 Host dashboard 密碼只會解鎖 Oysterun,不會替 Claude 或
|
|
137
|
-
<li>確認預期的 Claude Code 或
|
|
137
|
+
<li>開啟預期的 Oysterun Host 並進入 <strong>Sessions</strong>。輸入 Host dashboard 密碼只會解鎖 Oysterun,不會替 Codex、Claude Code 或 Grok 登入。</li>
|
|
138
|
+
<li>確認預期的 Codex、Claude Code 或 Grok 命令,可由「執行 Host 的同一個作業系統使用者」解析。若它只安裝給另一個使用者,不會讓這裡的 runtime 變成可用。</li>
|
|
138
139
|
<li>先知道新 Session 應使用哪個 <strong>Start Folder</strong>。你要確認的是即將建立之 Session 的提供者狀態,不是另一個 Host 或資料夾。</li>
|
|
139
140
|
</ul>
|
|
140
141
|
<aside class="safety-note">
|
|
@@ -143,11 +144,11 @@
|
|
|
143
144
|
</section>
|
|
144
145
|
|
|
145
146
|
<section aria-labelledby="choose-runtime">
|
|
146
|
-
<h2 id="choose-runtime">2. 在 Session Setup 選擇 Claude 或
|
|
147
|
+
<h2 id="choose-runtime">2. 在 Session Setup 選擇 Codex、Claude 或 Grok</h2>
|
|
147
148
|
<ol>
|
|
148
149
|
<li>從 <strong>Sessions</strong> 選擇 <strong>New Session</strong>。</li>
|
|
149
150
|
<li>在 <strong>Session Setup</strong> 找到 <strong>Provider Runtime</strong>,再找到 <strong>Agent Runtime</strong>。</li>
|
|
150
|
-
<li>選擇 <strong>Claude</strong> 或 <strong>
|
|
151
|
+
<li>選擇 <strong>Codex</strong>、<strong>Claude</strong> 或 <strong>Grok</strong>。Oysterun 只顯示其已儲存命令目前可在此 Host 使用的 runtime;缺少的 runtime 目前未由該 Host 提供。</li>
|
|
151
152
|
<li>繼續前,讀取畫面上的 <strong>Model</strong>、<strong>Reasoning Effort</strong>,以及該提供者專用的固定控制項。</li>
|
|
152
153
|
</ol>
|
|
153
154
|
|
|
@@ -160,9 +161,13 @@
|
|
|
160
161
|
<h3 id="codex-controls">Codex</h3>
|
|
161
162
|
<p>Codex 使用 <strong>Approval Style</strong>。在一般 Oysterun Sessions 中,它會刻意停用並顯示 <strong>Fixed for Oysterun Sessions.</strong> Codex 沒有 <code>auto</code> 推理選項。若所選 Codex 模型支援原生 <code>xhigh</code>,Oysterun 會顯示產品標籤 <code>max</code>。</p>
|
|
162
163
|
</article>
|
|
164
|
+
<article class="provider-card grok-card">
|
|
165
|
+
<h3 id="grok-controls">Grok</h3>
|
|
166
|
+
<p>Grok 需要官方 CLI <strong>1.0.25 或更新版本</strong>。Model 與 Reasoning Effort 來自 provider 的結構化 metadata;若 Oysterun 回報版本過舊或無法驗證,請先更新 CLI。</p>
|
|
167
|
+
</article>
|
|
163
168
|
</div>
|
|
164
169
|
|
|
165
|
-
<p>若已儲存的預設 runtime 不可用,Oysterun 可以暫時為新 Session 選取另一個可用 runtime,並說明哪個已儲存提供者不可用、新 Sessions 會使用哪個提供者。請以亮起的 <strong>Claude</strong> 或 <strong>
|
|
170
|
+
<p>若已儲存的預設 runtime 不可用,Oysterun 可以暫時為新 Session 選取另一個可用 runtime,並說明哪個已儲存提供者不可用、新 Sessions 會使用哪個提供者。請以亮起的 <strong>Codex</strong>、<strong>Claude</strong> 或 <strong>Grok</strong> 按鈕判斷目前選擇,不要沿用舊預設的印象。切換提供者是一次有意識的新選擇;開始前要重新檢查 Model 與 Reasoning Effort。</p>
|
|
166
171
|
</section>
|
|
167
172
|
|
|
168
173
|
<section aria-labelledby="refresh-catalog">
|
|
@@ -209,8 +214,8 @@
|
|
|
209
214
|
|
|
210
215
|
<ol>
|
|
211
216
|
<li>開啟 Oysterun 選單,選擇 <strong>Host Preferences</strong>。</li>
|
|
212
|
-
<li
|
|
213
|
-
<li
|
|
217
|
+
<li>找到預期的 <strong>Codex</strong>、<strong>Claude</strong> 或 <strong>Grok Runtime Defaults</strong>。</li>
|
|
218
|
+
<li>讀取對應的 provider command。空白欄位會明確停用該 runtime。可用命令顯示 <strong>Available on this Host.</strong>;無法解析的命令顯示 <strong>Unavailable on this Host.</strong></li>
|
|
214
219
|
<li>為 Host 的作業系統使用者修正提供者安裝或執行檔路徑。若變更命令欄位,選擇 <strong>Save</strong>,再返回 Session Setup。</li>
|
|
215
220
|
<li>選擇該 runtime、重新整理模型一次;只有在成功狀態與有效的 Model/Reasoning Effort 選項都可見後才繼續。</li>
|
|
216
221
|
</ol>
|
|
@@ -229,7 +234,7 @@
|
|
|
229
234
|
|
|
230
235
|
<ol>
|
|
231
236
|
<li>使用執行該提供者的機器 terminal;若無法用其他方式開啟,選擇可見系統列中的 <strong>Open Terminal</strong> 連結。</li>
|
|
232
|
-
<li>Codex 執行 <code>codex /login</code>;Claude 執行 <code>claude /login</code>。</li>
|
|
237
|
+
<li>Codex 執行 <code>codex /login</code>;Claude 執行 <code>claude /login</code>;Grok 執行 <code>grok login</code>。</li>
|
|
233
238
|
<li>在提供者擁有的瀏覽器或 terminal 登入流程完成操作;不要把 URL、代碼、token 或輸出存成公開證據。</li>
|
|
234
239
|
<li>回到同一個受影響的 Chat。系統列把動作稱為 <strong>Restart session</strong>;實際操作為 <strong>More Options</strong>(垂直省略號)→ <strong>Restart</strong>。這只會重新啟動該提供者 Session;它不代表你有權重新啟動 Oysterun Host。</li>
|
|
235
240
|
<li>傳送一則不含敏感資料的簡短訊息。正常回覆就是復原判定。</li>
|