mirror of
https://github.com/OpenRouterTeam/spawn.git
synced 2026-04-28 11:59:29 +00:00
* fix: add unique spawn IDs to prevent history record corruption
History records were matched by heuristic ("most recent record for this
cloud without a connection"), which caused saveVmConnection and
saveLaunchCmd to overwrite the wrong record during concurrent or failed
spawns.
Fix: every SpawnRecord now has a unique `id` (UUID). All history
operations (saveVmConnection, saveLaunchCmd, removeRecord,
markRecordDeleted, mergeLastConnection) match by id when available,
falling back to the old heuristic for pre-migration records.
The orchestrator (TS path) now creates the history record AFTER server
creation succeeds, not before — so failed provisions don't leave orphan
entries.
Also adds "Remove from history" option to the spawn ls action picker,
restoring the ability to soft-delete entries without destroying the VM.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* test: add 18 unit tests for spawn ID history behavior
Tests cover:
- generateSpawnId returns unique UUIDs
- saveSpawnRecord auto-generates id when not provided
- saveVmConnection matches by spawnId (not heuristic)
- saveVmConnection does not cross-contaminate concurrent spawns
- saveVmConnection falls back to heuristic without spawnId
- saveLaunchCmd matches by spawnId (not heuristic)
- saveLaunchCmd falls back without spawnId
- removeRecord matches by id, not by timestamp+agent+cloud
- removeRecord handles duplicate timestamps correctly
- removeRecord falls back for legacy records without id
- markRecordDeleted targets correct record by id
- mergeLastConnection uses spawn_id from last-connection.json
- mergeLastConnection falls back to heuristic without spawn_id
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style: enable biome import sorting with grouped imports
Adds organizeImports to biome assist config with groups:
1. Type imports
2. Node built-ins
3. Third-party packages
4. @openrouter/* packages
5. Aliases
Auto-fixed import order and lint issues across all TypeScript files,
including .claude/skills/ and packages/cli/src/.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
104 lines
2.6 KiB
JSON
104 lines
2.6 KiB
JSON
{
|
|
"$schema": "https://biomejs.dev/schemas/2.4.4/schema.json",
|
|
"formatter": {
|
|
"enabled": true,
|
|
"indentStyle": "space",
|
|
"indentWidth": 2,
|
|
"lineWidth": 120
|
|
},
|
|
"linter": {
|
|
"enabled": true,
|
|
"rules": {
|
|
"recommended": true,
|
|
"complexity": {
|
|
"useLiteralKeys": "off",
|
|
"noForEach": "off",
|
|
"noUselessSwitchCase": "off"
|
|
},
|
|
"style": {
|
|
"noNonNullAssertion": "off",
|
|
"useNodejsImportProtocol": "error",
|
|
"useTemplate": "off",
|
|
"useBlockStatements": "error",
|
|
"noParameterAssign": "off",
|
|
"useConst": "error",
|
|
"useDefaultParameterLast": "error",
|
|
"useSelfClosingElements": "error",
|
|
"useSingleVarDeclarator": "error",
|
|
"noUnusedTemplateLiteral": "error",
|
|
"useNumberNamespace": "error",
|
|
"noInferrableTypes": "error",
|
|
"noUselessElse": "error",
|
|
"useImportType": {
|
|
"level": "error",
|
|
"options": {
|
|
"style": "separatedType"
|
|
}
|
|
}
|
|
},
|
|
"correctness": {
|
|
"noUnusedImports": "error",
|
|
"noUnusedVariables": "error",
|
|
"noUnusedFunctionParameters": "warn",
|
|
"noInnerDeclarations": "error"
|
|
},
|
|
"suspicious": {
|
|
"noExplicitAny": "warn",
|
|
"noAssignInExpressions": "error",
|
|
"noFallthroughSwitchClause": "error",
|
|
"noDoubleEquals": "error",
|
|
"noExtraNonNullAssertion": "error",
|
|
"noTemplateCurlyInString": "off",
|
|
"noImplicitAnyLet": "error",
|
|
"noGlobalIsNan": "error",
|
|
"noGlobalIsFinite": "error",
|
|
"noControlCharactersInRegex": "off"
|
|
},
|
|
"performance": {
|
|
"recommended": true,
|
|
"noAccumulatingSpread": "error"
|
|
},
|
|
"security": {
|
|
"recommended": true
|
|
}
|
|
}
|
|
},
|
|
"javascript": {
|
|
"formatter": {
|
|
"expand": "always",
|
|
"arrowParentheses": "always",
|
|
"quoteStyle": "double",
|
|
"trailingCommas": "all",
|
|
"semicolons": "always",
|
|
"bracketSpacing": true,
|
|
"bracketSameLine": false
|
|
}
|
|
},
|
|
"assist": {
|
|
"actions": {
|
|
"source": {
|
|
"organizeImports": {
|
|
"level": "on",
|
|
"options": {
|
|
"groups": [
|
|
{
|
|
"type": true
|
|
},
|
|
":BLANK_LINE:",
|
|
{
|
|
"type": false
|
|
},
|
|
[":NODE:"],
|
|
":BLANK_LINE:",
|
|
["!@openrouter/**"],
|
|
":BLANK_LINE:",
|
|
["@openrouter/**"],
|
|
":BLANK_LINE:",
|
|
":ALIAS:"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|