sigit-code 1.7.2__tar.gz → 1.7.3__tar.gz

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 (62) hide show
  1. {sigit_code-1.7.2 → sigit_code-1.7.3}/Cargo.lock +2 -2
  2. {sigit_code-1.7.2 → sigit_code-1.7.3}/Cargo.toml +2 -2
  3. {sigit_code-1.7.2 → sigit_code-1.7.3}/PKG-INFO +1 -1
  4. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/main.rs +76 -5
  5. {sigit_code-1.7.2 → sigit_code-1.7.3}/README.md +0 -0
  6. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/Cargo.toml +0 -0
  7. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/README.md +0 -0
  8. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/account.rs +0 -0
  9. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/backend.rs +0 -0
  10. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/chat.rs +0 -0
  11. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/client_fs.rs +0 -0
  12. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/client_terminal.rs +0 -0
  13. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/commands.rs +0 -0
  14. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/frontmatter.rs +0 -0
  15. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/harness_markup.rs +0 -0
  16. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/headless.rs +0 -0
  17. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/hooks.rs +0 -0
  18. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/inline_tool_calls.rs +0 -0
  19. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/instructions.rs +0 -0
  20. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/mcp.rs +0 -0
  21. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/models.rs +0 -0
  22. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/permissions.rs +0 -0
  23. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/program_status.rs +0 -0
  24. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/provider.rs +0 -0
  25. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/repetition.rs +0 -0
  26. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/session_store.rs +0 -0
  27. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/settings.rs +0 -0
  28. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/setup.rs +0 -0
  29. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/skills.rs +0 -0
  30. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/subagents.rs +0 -0
  31. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/tools.rs +0 -0
  32. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/src/workspace.rs +0 -0
  33. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_audio.rs +0 -0
  34. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_client_fs.rs +0 -0
  35. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_client_terminal.rs +0 -0
  36. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_concurrent_sessions.rs +0 -0
  37. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_elicitation.rs +0 -0
  38. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_embedded_context.rs +0 -0
  39. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_endpoint_errors.rs +0 -0
  40. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_error_codes.rs +0 -0
  41. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_harness_markup.rs +0 -0
  42. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_images.rs +0 -0
  43. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_logout.rs +0 -0
  44. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_multi_root.rs +0 -0
  45. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_permissions.rs +0 -0
  46. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_session_list.rs +0 -0
  47. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_session_load.rs +0 -0
  48. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_stop_reasons.rs +0 -0
  49. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_tool_call_name.rs +0 -0
  50. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/acp_tool_stdin.rs +0 -0
  51. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/headless_mode.rs +0 -0
  52. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/cli/tests/version_flag.rs +0 -0
  53. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/Cargo.toml +0 -0
  54. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/README.md +0 -0
  55. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/src/auth.rs +0 -0
  56. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/src/browser_auth.rs +0 -0
  57. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/src/credentials.rs +0 -0
  58. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/src/lib.rs +0 -0
  59. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/src/profile.rs +0 -0
  60. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/src/prompt.rs +0 -0
  61. {sigit_code-1.7.2 → sigit_code-1.7.3}/crates/sigit-agent/tests/embedded.rs +0 -0
  62. {sigit_code-1.7.2 → sigit_code-1.7.3}/pyproject.toml +0 -0
@@ -5945,7 +5945,7 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
5945
5945
 
5946
5946
  [[package]]
5947
5947
  name = "sigit"
5948
- version = "1.7.2"
5948
+ version = "1.7.3"
5949
5949
  dependencies = [
5950
5950
  "agent-client-protocol",
5951
5951
  "anyhow",
@@ -5976,7 +5976,7 @@ dependencies = [
5976
5976
 
5977
5977
  [[package]]
5978
5978
  name = "sigit-agent"
5979
- version = "1.7.2"
5979
+ version = "1.7.3"
5980
5980
  dependencies = [
5981
5981
  "agent-client-protocol",
5982
5982
  "anyhow",
@@ -3,7 +3,7 @@ resolver = "3"
3
3
  members = ["crates/cli", "crates/sigit-*"]
4
4
 
5
5
  [workspace.package]
6
- version = "1.7.2"
6
+ version = "1.7.3"
7
7
  edition = "2024"
8
8
  license = "Apache-2.0"
9
9
  repository = "https://github.com/getsigit/sigit"
@@ -16,7 +16,7 @@ authors = ["Seto Elkahfi <seto@sigit.si>", "paydii <193906237+paydii@users.norep
16
16
  # crates.io, so this resolves from the registry rather than the onde-ed checkout next door.
17
17
  ed-acp = { version = "1.3.0", default-features = false }
18
18
  ed-acp-testkit = "1.3.0"
19
- sigit-agent = { version = "1.7.2", default-features = false, path = "crates/sigit-agent" }
19
+ sigit-agent = { version = "1.7.3", default-features = false, path = "crates/sigit-agent" }
20
20
 
21
21
  # ACP protocol SDK
22
22
  agent-client-protocol = { version = "2.2", features = ["unstable_session_fork"] }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sigit-code
3
- Version: 1.7.2
3
+ Version: 1.7.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -2587,7 +2587,7 @@ impl SiGitAgent {
2587
2587
  cancellation: &PromptCancellation,
2588
2588
  ) {
2589
2589
  if workspace.reacquire().await
2590
- && let Err(error) = self.activate_session(session_id).await
2590
+ && let Err(error) = self.reinstall_for_tools(session_id).await
2591
2591
  {
2592
2592
  log::warn!(
2593
2593
  "session({session_id}): could not reinstall mid-turn, cancelling the turn: {}",
@@ -2598,6 +2598,30 @@ impl SiGitAgent {
2598
2598
  }
2599
2599
  }
2600
2600
 
2601
+ /// Make `session_id` the live session and check that its directory is still
2602
+ /// there. Tools resolve relative paths against the process directory, and
2603
+ /// `install_session` leaves that alone when the session's `cwd` is gone, so
2604
+ /// a prompt or a tool run on such a session would act in the previous
2605
+ /// session's directory. Load, resume and fork do not call this: they
2606
+ /// succeed for a deleted project so a client can still show its history.
2607
+ async fn reinstall_for_tools(
2608
+ &self,
2609
+ session_id: &SessionId,
2610
+ ) -> agent_client_protocol::Result<()> {
2611
+ self.activate_session(session_id).await?;
2612
+ let cwd = self.session_cwd.lock().unwrap().clone();
2613
+ match cwd {
2614
+ Some(cwd) if !cwd.is_dir() => Err(agent_client_protocol::Error::new(
2615
+ ErrorCode::ResourceNotFound.into(),
2616
+ format!(
2617
+ "the working directory of session {session_id} no longer exists: {}",
2618
+ cwd.display()
2619
+ ),
2620
+ )),
2621
+ _ => Ok(()),
2622
+ }
2623
+ }
2624
+
2601
2625
  /// Point the process at `state`'s roots and load its conversation.
2602
2626
  ///
2603
2627
  /// The process follows `cwd` because tool calls may use relative paths; the
@@ -2619,9 +2643,12 @@ impl SiGitAgent {
2619
2643
  }
2620
2644
  workspace::replace_additional_roots(additional_roots.clone());
2621
2645
  mcp::set_session_servers(mcp_servers);
2622
- if cwd.is_dir()
2623
- && let Err(err) = std::env::set_current_dir(&cwd)
2624
- {
2646
+ if !cwd.is_dir() {
2647
+ log::warn!(
2648
+ "session({key}): cwd {} no longer exists, prompts and tools on it will fail",
2649
+ cwd.display()
2650
+ );
2651
+ } else if let Err(err) = std::env::set_current_dir(&cwd) {
2625
2652
  log::warn!("could not set cwd to {}: {err}", cwd.display());
2626
2653
  }
2627
2654
  *self.active_session.lock().unwrap() = Some(key.to_string());
@@ -3270,7 +3297,7 @@ impl SiGitAgent {
3270
3297
  if cancellation.cancelled.load(Ordering::Acquire) {
3271
3298
  return Ok(PromptResponse::new(StopReason::Cancelled));
3272
3299
  }
3273
- self.activate_session(&session_id).await?;
3300
+ self.reinstall_for_tools(&session_id).await?;
3274
3301
  if cancellation.cancelled.load(Ordering::Acquire) {
3275
3302
  return Ok(PromptResponse::new(StopReason::Cancelled));
3276
3303
  }
@@ -7609,6 +7636,50 @@ mod tests {
7609
7636
  assert!(agent.active_session.lock().unwrap().is_none());
7610
7637
  }
7611
7638
 
7639
+ #[tokio::test]
7640
+ #[allow(clippy::await_holding_lock)] // the lock guards process-global env for the whole test
7641
+ async fn a_session_whose_directory_is_gone_loads_but_refuses_tools() {
7642
+ let _guard = crate::ENV_TEST_LOCK
7643
+ .lock()
7644
+ .unwrap_or_else(|poisoned| poisoned.into_inner());
7645
+ let agent = SiGitAgent::new(
7646
+ Arc::new(ChatEngine::new()),
7647
+ GgufModelConfig::qwen25_3b(),
7648
+ Arc::new(AtomicBool::new(true)),
7649
+ Arc::new(AtomicBool::new(false)),
7650
+ Arc::new(std::sync::Mutex::new(None)),
7651
+ false,
7652
+ false,
7653
+ );
7654
+ let dir = std::env::temp_dir().join(format!("sigit_gone_cwd_{}", std::process::id()));
7655
+ std::fs::create_dir_all(&dir).unwrap();
7656
+ let thread = SessionId::new("gone-cwd-thread");
7657
+ agent
7658
+ .sessions
7659
+ .lock()
7660
+ .unwrap()
7661
+ .insert("gone-cwd-thread".into(), agent.session_state(&dir, &[]));
7662
+ std::fs::remove_dir_all(&dir).unwrap();
7663
+
7664
+ // Load, resume and fork only activate, so they still succeed.
7665
+ agent.activate_session(&thread).await.unwrap();
7666
+
7667
+ // A prompt or a tool run does not.
7668
+ *agent.active_session.lock().unwrap() = None;
7669
+ let error = agent.reinstall_for_tools(&thread).await.unwrap_err();
7670
+ assert_eq!(error.code, ErrorCode::ResourceNotFound);
7671
+ assert!(error.message.contains("no longer exists"));
7672
+
7673
+ let cancellation = PromptCancellation::default();
7674
+ let mut workspace = WorkspaceHold::acquire(&agent.workspace_lock).await;
7675
+ workspace.release();
7676
+ *agent.active_session.lock().unwrap() = None;
7677
+ agent
7678
+ .resume_workspace(&mut workspace, &thread, &cancellation)
7679
+ .await;
7680
+ assert!(cancellation.cancelled.load(Ordering::Acquire));
7681
+ }
7682
+
7612
7683
  #[test]
7613
7684
  fn session_context_message_lists_every_root_of_a_multi_root_project() {
7614
7685
  let primary = PathBuf::from("/tmp/primary");
File without changes
File without changes