boulder-opal-scale-up-sdk 1.0.2__py3-none-any.whl → 1.0.4__py3-none-any.whl

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 (44) hide show
  1. {boulder_opal_scale_up_sdk-1.0.2.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/METADATA +1 -1
  2. boulder_opal_scale_up_sdk-1.0.4.dist-info/RECORD +67 -0
  3. boulderopalscaleupsdk/agent/worker.py +10 -5
  4. boulderopalscaleupsdk/common/dtypes.py +14 -1
  5. boulderopalscaleupsdk/common/typeclasses.py +22 -0
  6. boulderopalscaleupsdk/device/__init__.py +0 -8
  7. boulderopalscaleupsdk/device/common.py +0 -3
  8. boulderopalscaleupsdk/device/config_loader.py +1 -0
  9. boulderopalscaleupsdk/device/controller/qblox.py +129 -0
  10. boulderopalscaleupsdk/device/defcal.py +5 -44
  11. boulderopalscaleupsdk/device/device.py +34 -12
  12. boulderopalscaleupsdk/device/processor/__init__.py +0 -2
  13. boulderopalscaleupsdk/device/processor/common.py +37 -20
  14. boulderopalscaleupsdk/device/processor/superconducting_processor.py +28 -22
  15. boulderopalscaleupsdk/experiments/__init__.py +20 -2
  16. boulderopalscaleupsdk/experiments/chi01_scan.py +14 -8
  17. boulderopalscaleupsdk/experiments/common.py +15 -16
  18. boulderopalscaleupsdk/experiments/power_rabi.py +16 -12
  19. boulderopalscaleupsdk/experiments/power_rabi_ef.py +66 -0
  20. boulderopalscaleupsdk/experiments/ramsey.py +15 -17
  21. boulderopalscaleupsdk/experiments/readout_classifier_calibration.py +25 -5
  22. boulderopalscaleupsdk/experiments/resonator_spectroscopy.py +14 -17
  23. boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_bias.py +17 -20
  24. boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_power.py +12 -12
  25. boulderopalscaleupsdk/experiments/t1.py +46 -0
  26. boulderopalscaleupsdk/experiments/t2.py +49 -0
  27. boulderopalscaleupsdk/experiments/t2_echo.py +49 -0
  28. boulderopalscaleupsdk/experiments/transmon_anharmonicity.py +29 -26
  29. boulderopalscaleupsdk/experiments/transmon_spectroscopy.py +16 -21
  30. boulderopalscaleupsdk/experiments/waveforms.py +63 -0
  31. boulderopalscaleupsdk/plotting/dtypes.py +1 -0
  32. boulderopalscaleupsdk/protobuf/v1/device_pb2.py +20 -20
  33. boulderopalscaleupsdk/protobuf/v1/device_pb2.pyi +4 -2
  34. boulderopalscaleupsdk/protobuf/v1/task_pb2.py +16 -16
  35. boulderopalscaleupsdk/protobuf/v1/task_pb2.pyi +4 -2
  36. boulderopalscaleupsdk/routines/__init__.py +16 -1
  37. boulderopalscaleupsdk/routines/common.py +13 -0
  38. boulderopalscaleupsdk/routines/resonator_mapping.py +16 -0
  39. boulderopalscaleupsdk/routines/transmon_discovery.py +45 -0
  40. boulderopalscaleupsdk/routines/transmon_retuning.py +31 -0
  41. boulderopalscaleupsdk/stubs/maps.py +11 -2
  42. boulder_opal_scale_up_sdk-1.0.2.dist-info/RECORD +0 -60
  43. {boulder_opal_scale_up_sdk-1.0.2.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/LICENSE +0 -0
  44. {boulder_opal_scale_up_sdk-1.0.2.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/WHEEL +0 -0
@@ -33,23 +33,22 @@ class ResonatorSpectroscopyByPower(Experiment):
33
33
  Parameters
34
34
  ----------
35
35
  resonator : str
36
- The reference for the resonator to target in the experiment.
36
+ The reference for the resonator to target.
37
37
  frequencies : list[int] or LinspaceIterable or RangeIterable or CWSIterable
38
38
  or HypIterable or None, optional
39
- The frequencies at which to scan.
40
- If None, frequencies around the readout frequency will be used.
41
- powers : list[int] or None, optional
42
- The powers at which to scan the readout pulse.
39
+ The frequencies at which to scan, in Hz.
40
+ Defaults to a scan around the readout frequency.
41
+ powers_dbm : list[float] or None, optional
42
+ The powers at which to scan the readout pulse, in dBm.
43
43
  If None, a default power scan will be used.
44
44
  duration_ns : int, optional
45
- The duration of the readout pulse, in nanoseconds.
46
- Defaults to 2000 ns.
45
+ The duration of the readout pulse, in nanoseconds. Defaults to 2,000 ns.
47
46
  recycle_delay_ns : int, optional
48
- The delay time between consecutive shots of the experiment, in nanoseconds.
49
- Defaults to 1000 ns.
47
+ The delay between consecutive shots, in nanoseconds. Defaults to 1,000 ns.
50
48
  shot_count : int, optional
51
- The number of shots to be taken in the experiment.
52
- Defaults to 100.
49
+ The number of shots to take. Defaults to 100.
50
+ run_mixer_calibration: bool
51
+ Whether to run mixer calibrations before running a program. Defaults to False.
53
52
  """
54
53
 
55
54
  _experiment_name: str = PrivateAttr("resonator_spectroscopy_by_power")
@@ -58,7 +57,8 @@ class ResonatorSpectroscopyByPower(Experiment):
58
57
  frequencies: list[int] | LinspaceIterable | RangeIterable | CWSIterable | HypIterable | None = (
59
58
  None
60
59
  )
61
- powers: list[float] | None = None
60
+ powers_dbm: list[float] | None = None
62
61
  duration_ns: int = DEFAULT_DURATION_NS
63
62
  recycle_delay_ns: int = DEFAULT_RECYCLE_DELAY_NS
64
63
  shot_count: int = DEFAULT_SHOT_COUNT
64
+ run_mixer_calibration: bool = False
@@ -0,0 +1,46 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+ from pydantic import PrivateAttr
15
+
16
+ from .common import Experiment, LogspaceIterable
17
+
18
+ DEFAULT_RECYCLE_DELAY_NS = 200_000
19
+ DEFAULT_SHOT_COUNT = 400
20
+
21
+
22
+ class T1(Experiment):
23
+ """
24
+ Parameters for running a T1 experiment.
25
+
26
+ Parameters
27
+ ----------
28
+ transmon : str
29
+ The reference for the transmon to target.
30
+ delays_ns : LogspaceIterable
31
+ The delay times, in nanoseconds.
32
+ recycle_delay_ns : int, optional
33
+ The delay between consecutive shots, in nanoseconds. Defaults to 200,000 ns.
34
+ shot_count : int, optional
35
+ The number of shots to take. Defaults to 400.
36
+ run_mixer_calibration: bool
37
+ Whether to run mixer calibrations before running a program. Defaults to False.
38
+ """
39
+
40
+ _experiment_name: str = PrivateAttr("t1")
41
+
42
+ transmon: str
43
+ delays_ns: LogspaceIterable
44
+ recycle_delay_ns: int = DEFAULT_RECYCLE_DELAY_NS
45
+ shot_count: int = DEFAULT_SHOT_COUNT
46
+ run_mixer_calibration: bool = False
@@ -0,0 +1,49 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+ from pydantic import PrivateAttr
15
+
16
+ from .common import Experiment, RangeIterable
17
+
18
+ DEFAULT_RECYCLE_DELAY_NS = 100_000
19
+ DEFAULT_SHOT_COUNT = 400
20
+
21
+
22
+ class T2(Experiment):
23
+ """
24
+ Parameters for running a Ramsey experiment.
25
+
26
+ Parameters
27
+ ----------
28
+ transmon : str
29
+ The reference for the transmon to target.
30
+ delays_ns : list[int] or RangeIterable
31
+ The delay times, in nanoseconds.
32
+ virtual_detuning : float
33
+ The virtual detuning added between SX pulses, in Hz.
34
+ recycle_delay_ns : int, optional
35
+ The delay between consecutive shots, in nanoseconds. Defaults to 100,000 ns.
36
+ shot_count : int, optional
37
+ The number of shots to take. Defaults to 400.
38
+ run_mixer_calibration: bool
39
+ Whether to run mixer calibrations before running a program. Defaults to False.
40
+ """
41
+
42
+ _experiment_name: str = PrivateAttr("t2")
43
+
44
+ transmon: str
45
+ delays_ns: list[int] | RangeIterable
46
+ virtual_detuning: float
47
+ recycle_delay_ns: int = DEFAULT_RECYCLE_DELAY_NS
48
+ shot_count: int = DEFAULT_SHOT_COUNT
49
+ run_mixer_calibration: bool = False
@@ -0,0 +1,49 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+ from pydantic import PrivateAttr
15
+
16
+ from .common import Experiment, RangeIterable
17
+
18
+ DEFAULT_RECYCLE_DELAY_NS = 100_000
19
+ DEFAULT_SHOT_COUNT = 400
20
+
21
+
22
+ class T2Echo(Experiment):
23
+ """
24
+ Parameters for running a T2 echo experiment.
25
+
26
+ Parameters
27
+ ----------
28
+ transmon : str
29
+ The reference for the transmon to target.
30
+ delays_ns : list[int] or RangeIterable
31
+ The delay times, in nanoseconds.
32
+ virtual_detuning : float
33
+ The virtual detuning added between SX pulses, in Hz.
34
+ recycle_delay_ns : int, optional
35
+ The delay between consecutive shots, in nanoseconds. Defaults to 100,000 ns.
36
+ shot_count : int, optional
37
+ The number of shots to take. Defaults to 400.
38
+ run_mixer_calibration: bool
39
+ Whether to run mixer calibrations before running a program. Defaults to False.
40
+ """
41
+
42
+ _experiment_name: str = PrivateAttr("t2_echo")
43
+
44
+ transmon: str
45
+ delays_ns: list[int] | RangeIterable
46
+ virtual_detuning: float
47
+ recycle_delay_ns: int = DEFAULT_RECYCLE_DELAY_NS
48
+ shot_count: int = DEFAULT_SHOT_COUNT
49
+ run_mixer_calibration: bool = False
@@ -13,9 +13,15 @@
13
13
 
14
14
  from pydantic import PrivateAttr
15
15
 
16
- from .common import CWSIterable, Experiment, HypIterable, LinspaceIterable, RangeIterable
16
+ from .common import (
17
+ CWSIterable,
18
+ Experiment,
19
+ HypIterable,
20
+ LinspaceIterable,
21
+ RangeIterable,
22
+ )
23
+ from .waveforms import ConstantWaveform
17
24
 
18
- DEFAULT_DURATION_NS = 2_000 # ns
19
25
  DEFAULT_RECYCLE_DELAY_NS = 1_000 # ns
20
26
  DEFAULT_SHOT_COUNT = 100
21
27
  DEFAULT_ANHARMONICITY_GUESS = -200e6 # Hz, typical anharmonicity for transmons
@@ -28,29 +34,27 @@ class TransmonAnharmonicity(Experiment):
28
34
  Parameters
29
35
  ----------
30
36
  transmon : str
31
- The transmon that is the target of the experiment.
37
+ The reference for the transmon to target.
32
38
  frequencies : list[int] or LinspaceIterable or RangeIterable or CWSIterable
33
39
  or HypIterable or None, optional
34
- The drive frequencies to be scanned in the experiment.
35
- If None, a default scan will be used based on the transmon's frequency and anharmonicity.
36
- spec_amplitude : float
37
- The amplitude of the spectroscopy pulse, in volts.
38
- spec_duration : int
39
- The duration of the spectroscopy pulse, in nanoseconds.
40
- anharmonicity_guess_hz : float
41
- The guessed anharmonicity of the qubit, in Hz. This is used to determine the
42
- range of frequencies to scan if `frequencies` is not provided.
43
- Defaults to -200 MHz.
44
- readout_amplitude : float
45
- The amplitude of the readout pulse.
46
- duration_ns : int, optional
47
- The duration of the readout pulse, in nanoseconds.
48
- Defaults to 2000 ns.
40
+ The frequencies at which to scan, in Hz.
41
+ Defaults to a scan based on the transmon's frequency and anharmonicity.
42
+ anharmonicity : float, optional
43
+ The guessed anharmonicity of the transmon, in Hz.
44
+ Used to determine the scan frequencies if not provided. Defaults to -200 MHz.
49
45
  recycle_delay_ns : int, optional
50
- The delay time between consecutive shots of the experiment, in nanoseconds.
51
- Defaults to 1000 ns.
46
+ The delay between consecutive shots, in nanoseconds. Defaults to 1,000 ns.
52
47
  shot_count : int, optional
53
- The number of shots to be taken in the experiment. Defaults to 100.
48
+ The number of shots to take. Defaults to 100.
49
+ spectroscopy_waveform : ConstantWaveform or None, optional
50
+ The waveform to use in the spectroscopy pulse.
51
+ Defaults to a constant waveform with a duration of 2,000 ns
52
+ and an amplitude of 1.5 times the transmon's x_vp.
53
+ measure_waveform : ConstantWaveform or None, optional
54
+ The waveform to use for the measurement pulse.
55
+ Defaults to the measurement defcal.
56
+ run_mixer_calibration: bool
57
+ Whether to run mixer calibrations before running a program. Defaults to False.
54
58
  """
55
59
 
56
60
  _experiment_name: str = PrivateAttr("transmon_anharmonicity")
@@ -59,10 +63,9 @@ class TransmonAnharmonicity(Experiment):
59
63
  frequencies: list[int] | LinspaceIterable | RangeIterable | CWSIterable | HypIterable | None = (
60
64
  None
61
65
  )
62
- spec_amplitude: float
63
- spec_duration: int
64
- anharmonicity_guess_hz: float = DEFAULT_ANHARMONICITY_GUESS
65
- readout_amplitude: float
66
- duration_ns: int = DEFAULT_DURATION_NS
66
+ anharmonicity: float = DEFAULT_ANHARMONICITY_GUESS
67
67
  recycle_delay_ns: int = DEFAULT_RECYCLE_DELAY_NS
68
68
  shot_count: int = DEFAULT_SHOT_COUNT
69
+ spectroscopy_waveform: ConstantWaveform | None = None
70
+ measure_waveform: ConstantWaveform | None = None
71
+ run_mixer_calibration: bool = False
@@ -20,8 +20,8 @@ from .common import (
20
20
  LinspaceIterable,
21
21
  RangeIterable,
22
22
  )
23
+ from .waveforms import ConstantWaveform
23
24
 
24
- DEFAULT_DURATION_NS = 2000 # ns
25
25
  DEFAULT_RECYCLE_DELAY_NS = 1000 # ns
26
26
  DEFAULT_SHOT_COUNT = 100
27
27
 
@@ -33,26 +33,22 @@ class TransmonSpectroscopy(Experiment):
33
33
  Parameters
34
34
  ----------
35
35
  transmon : str
36
- The reference for the transmon to target in the experiment.
36
+ The reference for the transmon to target.
37
37
  frequencies : list[int] or LinspaceIterable or RangeIterable or CWSIterable
38
38
  or HypIterable or None, optional
39
- The frequencies at which to scan.
40
- If None, frequencies around the readout frequency will be used.
41
- spec_amplitude : float
42
- The amplitude of the spectroscopy pulse.
43
- spec_duration : int
44
- The duration of the spectroscopy pulse, in nanoseconds.
45
- readout_amplitude : float
46
- The amplitude of the readout pulse.
47
- duration_ns : int, optional
48
- The duration of the readout pulse, in nanoseconds.
49
- Defaults to 2000 ns.
39
+ The frequencies at which to scan, in Hz.
40
+ Default to a scan around the transmon frequency.
50
41
  recycle_delay_ns : int, optional
51
- The delay time between consecutive shots of the experiment, in nanoseconds.
52
- Defaults to 1000 ns.
42
+ The delay between consecutive shots, in nanoseconds. Defaults to 1,000 ns.
53
43
  shot_count : int, optional
54
- The number of shots to be taken in the experiment.
55
- Defaults to 100.
44
+ The number of shots to take. Defaults to 100.
45
+ spectroscopy_waveform : ConstantWaveform
46
+ The waveform to use in the spectroscopy pulse.
47
+ measure_waveform : ConstantWaveform or None, optional
48
+ The waveform to use for the measurement pulse.
49
+ Defaults to the measurement defcal.
50
+ run_mixer_calibration: bool
51
+ Whether to run mixer calibrations before running a program. Defaults to False.
56
52
  """
57
53
 
58
54
  _experiment_name: str = PrivateAttr("transmon_spectroscopy")
@@ -61,9 +57,8 @@ class TransmonSpectroscopy(Experiment):
61
57
  frequencies: list[int] | LinspaceIterable | RangeIterable | CWSIterable | HypIterable | None = (
62
58
  None
63
59
  )
64
- spec_amplitude: float
65
- spec_duration: int
66
- readout_amplitude: float
67
- duration_ns: int = DEFAULT_DURATION_NS
68
60
  recycle_delay_ns: int = DEFAULT_RECYCLE_DELAY_NS
69
61
  shot_count: int = DEFAULT_SHOT_COUNT
62
+ spectroscopy_waveform: ConstantWaveform
63
+ measure_waveform: ConstantWaveform | None = None
64
+ run_mixer_calibration: bool = False
@@ -0,0 +1,63 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+ from dataclasses import replace
15
+ from typing import Annotated, Literal, Protocol, TypeVar
16
+
17
+ from pydantic import Discriminator
18
+ from pydantic.dataclasses import dataclass
19
+
20
+
21
+ class _Waveform(Protocol): # pragma: no cover
22
+ duration_ns: int
23
+ amplitude: float
24
+
25
+
26
+ @dataclass
27
+ class ConstantWaveform(_Waveform): # pragma: no cover
28
+ duration_ns: int
29
+ amplitude: float
30
+ waveform_type: Literal["Constant"] = "Constant"
31
+
32
+
33
+ @dataclass
34
+ class GaussianWaveform(_Waveform): # pragma: no cover
35
+ duration_ns: int
36
+ amplitude: float
37
+ sigma: float
38
+ waveform_type: Literal["Gaussian"] = "Gaussian"
39
+
40
+
41
+ @dataclass
42
+ class DragCosineWaveform(_Waveform): # pragma: no cover
43
+ duration_ns: int
44
+ amplitude: float
45
+ drag: float
46
+ buffer_ns: int
47
+ center: float
48
+ waveform_type: Literal["DragCosineWaveform"] = "DragCosineWaveform"
49
+
50
+
51
+ Waveform = Annotated[
52
+ ConstantWaveform | GaussianWaveform | DragCosineWaveform,
53
+ Discriminator("waveform_type"),
54
+ ]
55
+
56
+ T = TypeVar("T", bound=Waveform)
57
+
58
+
59
+ def update_amplitude(waveform: T, amplitude: float) -> T:
60
+ """
61
+ Update the amplitude of a waveform.
62
+ """
63
+ return replace(waveform, amplitude=amplitude)
@@ -71,6 +71,7 @@ class PlotConfig(BaseModel):
71
71
  model_config = ConfigDict(extra="forbid")
72
72
 
73
73
  title: str
74
+ subtitle: str | None = None
74
75
 
75
76
  x_label: str
76
77
  y_label: str
@@ -16,7 +16,7 @@ from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
16
16
  from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.boulderopalscaleupsdk/protobuf/v1/device.proto\x12!boulderopalscaleupsdk.protobuf.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n\x14GetJobSummaryRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"Z\n\x15GetJobSummaryResponse\x12\x41\n\x10job_summary_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0ejobSummaryData\"&\n\rGetJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"D\n\x0eGetJobResponse\x12\x32\n\x08job_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x07jobData\"\x96\x01\n\x0fListJobsRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x19\n\x08job_name\x18\x02 \x01(\tR\x07jobName\x12\x12\n\x04page\x18\x03 \x01(\x05R\x04page\x12\x14\n\x05limit\x18\x04 \x01(\x05R\x05limit\x12\x1d\n\nsort_order\x18\x05 \x01(\x05R\tsortOrder\"?\n\x10ListJobsResponse\x12+\n\x04jobs\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\x04jobs\"\x85\x01\n\rCreateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12\x38\n\x0b\x64\x65vice_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\ndeviceData\"$\n\x0e\x43reateResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"]\n\x0b\x43opyRequest\x12(\n\x10\x66rom_device_name\x18\x01 \x01(\tR\x0e\x66romDeviceName\x12$\n\x0eto_device_name\x18\x02 \x01(\tR\x0ctoDeviceName\"\"\n\x0c\x43opyResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"L\n\x0eGetDataRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"\x93\x01\n\x0fGetDataResponse\x12>\n\x0eprocessor_data\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\"\x8b\x01\n\rUpdateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\"\x92\x01\n\x0eUpdateResponse\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x04 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\"K\n\rDeleteRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"$\n\x0e\x44\x65leteResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"5\n\x12GetMetadataRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\"J\n\x13GetMetadataResponse\x12\x33\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\"\x1e\n\x1cGetAllDevicesMetadataRequest\"V\n\x1dGetAllDevicesMetadataResponse\x12\x35\n\tmetadatas\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\tmetadatas2\xb0\x0c\n\x14\x44\x65viceManagerService\x12\x8b\x01\n\x06\x43reate\x12\x30.boulderopalscaleupsdk.protobuf.v1.CreateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.CreateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/create:\x01*\x12\x83\x01\n\x04\x43opy\x12..boulderopalscaleupsdk.protobuf.v1.CopyRequest\x1a/.boulderopalscaleupsdk.protobuf.v1.CopyResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\"\x0f/v1/device/copy:\x01*\x12\x97\x01\n\x07GetData\x12\x31.boulderopalscaleupsdk.protobuf.v1.GetDataRequest\x1a\x32.boulderopalscaleupsdk.protobuf.v1.GetDataResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_device_data:\x01*\x12\x8b\x01\n\x06Update\x12\x30.boulderopalscaleupsdk.protobuf.v1.UpdateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.UpdateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/update:\x01*\x12\x8b\x01\n\x06\x44\x65lete\x12\x30.boulderopalscaleupsdk.protobuf.v1.DeleteRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.DeleteResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/delete:\x01*\x12\x94\x01\n\x08ListJobs\x12\x32.boulderopalscaleupsdk.protobuf.v1.ListJobsRequest\x1a\x33.boulderopalscaleupsdk.protobuf.v1.ListJobsResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\"\x14/v1/device/list_jobs:\x01*\x12\x8c\x01\n\x06GetJob\x12\x30.boulderopalscaleupsdk.protobuf.v1.GetJobRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.GetJobResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\"\x12/v1/device/get_job:\x01*\x12\xa9\x01\n\rGetJobSummary\x12\x37.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryRequest\x1a\x38.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_job_summary:\x01*\x12\xa7\x01\n\x0bGetMetadata\x12\x35.boulderopalscaleupsdk.protobuf.v1.GetMetadataRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.GetMetadataResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/device/get_device_metadata:\x01*\x12\xd1\x01\n\x15GetAllDevicesMetadata\x12?.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataRequest\x1a@.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataResponse\"5\x82\xd3\xe4\x93\x02/\"*/v1/device/get_all_devices_metadata_by_org:\x01*B\xaa\x02\n%com.boulderopalscaleupsdk.protobuf.v1B\x0b\x44\x65viceProtoP\x01ZNgithub.com/qctrl/boulder-opal-scale-up/proto/boulderopalscaleupsdk/protobuf/v1\xa2\x02\x03\x42PX\xaa\x02!Boulderopalscaleupsdk.Protobuf.V1\xca\x02!Boulderopalscaleupsdk\\Protobuf\\V1\xe2\x02-Boulderopalscaleupsdk\\Protobuf\\V1\\GPBMetadata\xea\x02#Boulderopalscaleupsdk::Protobuf::V1b\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.boulderopalscaleupsdk/protobuf/v1/device.proto\x12!boulderopalscaleupsdk.protobuf.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n\x14GetJobSummaryRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"Z\n\x15GetJobSummaryResponse\x12\x41\n\x10job_summary_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0ejobSummaryData\"&\n\rGetJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"D\n\x0eGetJobResponse\x12\x32\n\x08job_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x07jobData\"\x96\x01\n\x0fListJobsRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x19\n\x08job_name\x18\x02 \x01(\tR\x07jobName\x12\x12\n\x04page\x18\x03 \x01(\x05R\x04page\x12\x14\n\x05limit\x18\x04 \x01(\x05R\x05limit\x12\x1d\n\nsort_order\x18\x05 \x01(\x05R\tsortOrder\"?\n\x10ListJobsResponse\x12+\n\x04jobs\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\x04jobs\"\x85\x01\n\rCreateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12\x38\n\x0b\x64\x65vice_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\ndeviceData\"$\n\x0e\x43reateResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"]\n\x0b\x43opyRequest\x12(\n\x10\x66rom_device_name\x18\x01 \x01(\tR\x0e\x66romDeviceName\x12$\n\x0eto_device_name\x18\x02 \x01(\tR\x0ctoDeviceName\"\"\n\x0c\x43opyResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"L\n\x0eGetDataRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"\xc6\x01\n\x0fGetDataResponse\x12>\n\x0eprocessor_data\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\x12\x31\n\x07\x64\x65\x66\x63\x61ls\x18\x04 \x03(\x0b\x32\x17.google.protobuf.StructR\x07\x64\x65\x66\x63\x61ls\"\x8b\x01\n\rUpdateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\"\x92\x01\n\x0eUpdateResponse\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x04 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\"K\n\rDeleteRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"$\n\x0e\x44\x65leteResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"5\n\x12GetMetadataRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\"J\n\x13GetMetadataResponse\x12\x33\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\"\x1e\n\x1cGetAllDevicesMetadataRequest\"V\n\x1dGetAllDevicesMetadataResponse\x12\x35\n\tmetadatas\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\tmetadatas2\xb0\x0c\n\x14\x44\x65viceManagerService\x12\x8b\x01\n\x06\x43reate\x12\x30.boulderopalscaleupsdk.protobuf.v1.CreateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.CreateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/create:\x01*\x12\x83\x01\n\x04\x43opy\x12..boulderopalscaleupsdk.protobuf.v1.CopyRequest\x1a/.boulderopalscaleupsdk.protobuf.v1.CopyResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\"\x0f/v1/device/copy:\x01*\x12\x97\x01\n\x07GetData\x12\x31.boulderopalscaleupsdk.protobuf.v1.GetDataRequest\x1a\x32.boulderopalscaleupsdk.protobuf.v1.GetDataResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_device_data:\x01*\x12\x8b\x01\n\x06Update\x12\x30.boulderopalscaleupsdk.protobuf.v1.UpdateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.UpdateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/update:\x01*\x12\x8b\x01\n\x06\x44\x65lete\x12\x30.boulderopalscaleupsdk.protobuf.v1.DeleteRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.DeleteResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/delete:\x01*\x12\x94\x01\n\x08ListJobs\x12\x32.boulderopalscaleupsdk.protobuf.v1.ListJobsRequest\x1a\x33.boulderopalscaleupsdk.protobuf.v1.ListJobsResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\"\x14/v1/device/list_jobs:\x01*\x12\x8c\x01\n\x06GetJob\x12\x30.boulderopalscaleupsdk.protobuf.v1.GetJobRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.GetJobResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\"\x12/v1/device/get_job:\x01*\x12\xa9\x01\n\rGetJobSummary\x12\x37.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryRequest\x1a\x38.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_job_summary:\x01*\x12\xa7\x01\n\x0bGetMetadata\x12\x35.boulderopalscaleupsdk.protobuf.v1.GetMetadataRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.GetMetadataResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/device/get_device_metadata:\x01*\x12\xd1\x01\n\x15GetAllDevicesMetadata\x12?.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataRequest\x1a@.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataResponse\"5\x82\xd3\xe4\x93\x02/\"*/v1/device/get_all_devices_metadata_by_org:\x01*B\xaa\x02\n%com.boulderopalscaleupsdk.protobuf.v1B\x0b\x44\x65viceProtoP\x01ZNgithub.com/qctrl/boulder-opal-scale-up/proto/boulderopalscaleupsdk/protobuf/v1\xa2\x02\x03\x42PX\xaa\x02!Boulderopalscaleupsdk.Protobuf.V1\xca\x02!Boulderopalscaleupsdk\\Protobuf\\V1\xe2\x02-Boulderopalscaleupsdk\\Protobuf\\V1\\GPBMetadata\xea\x02#Boulderopalscaleupsdk::Protobuf::V1b\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -67,23 +67,23 @@ if not _descriptor._USE_C_DESCRIPTORS:
67
67
  _globals['_GETDATAREQUEST']._serialized_start=917
68
68
  _globals['_GETDATAREQUEST']._serialized_end=993
69
69
  _globals['_GETDATARESPONSE']._serialized_start=996
70
- _globals['_GETDATARESPONSE']._serialized_end=1143
71
- _globals['_UPDATEREQUEST']._serialized_start=1146
72
- _globals['_UPDATEREQUEST']._serialized_end=1285
73
- _globals['_UPDATERESPONSE']._serialized_start=1288
74
- _globals['_UPDATERESPONSE']._serialized_end=1434
75
- _globals['_DELETEREQUEST']._serialized_start=1436
76
- _globals['_DELETEREQUEST']._serialized_end=1511
77
- _globals['_DELETERESPONSE']._serialized_start=1513
78
- _globals['_DELETERESPONSE']._serialized_end=1549
79
- _globals['_GETMETADATAREQUEST']._serialized_start=1551
80
- _globals['_GETMETADATAREQUEST']._serialized_end=1604
81
- _globals['_GETMETADATARESPONSE']._serialized_start=1606
82
- _globals['_GETMETADATARESPONSE']._serialized_end=1680
83
- _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_start=1682
84
- _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_end=1712
85
- _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_start=1714
86
- _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_end=1800
87
- _globals['_DEVICEMANAGERSERVICE']._serialized_start=1803
88
- _globals['_DEVICEMANAGERSERVICE']._serialized_end=3387
70
+ _globals['_GETDATARESPONSE']._serialized_end=1194
71
+ _globals['_UPDATEREQUEST']._serialized_start=1197
72
+ _globals['_UPDATEREQUEST']._serialized_end=1336
73
+ _globals['_UPDATERESPONSE']._serialized_start=1339
74
+ _globals['_UPDATERESPONSE']._serialized_end=1485
75
+ _globals['_DELETEREQUEST']._serialized_start=1487
76
+ _globals['_DELETEREQUEST']._serialized_end=1562
77
+ _globals['_DELETERESPONSE']._serialized_start=1564
78
+ _globals['_DELETERESPONSE']._serialized_end=1600
79
+ _globals['_GETMETADATAREQUEST']._serialized_start=1602
80
+ _globals['_GETMETADATAREQUEST']._serialized_end=1655
81
+ _globals['_GETMETADATARESPONSE']._serialized_start=1657
82
+ _globals['_GETMETADATARESPONSE']._serialized_end=1731
83
+ _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_start=1733
84
+ _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_end=1763
85
+ _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_start=1765
86
+ _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_end=1851
87
+ _globals['_DEVICEMANAGERSERVICE']._serialized_start=1854
88
+ _globals['_DEVICEMANAGERSERVICE']._serialized_end=3438
89
89
  # @@protoc_insertion_point(module_scope)
@@ -90,12 +90,14 @@ class GetDataRequest(_message.Message):
90
90
  def __init__(self, app_name: _Optional[str] = ..., device_name: _Optional[str] = ...) -> None: ...
91
91
 
92
92
  class GetDataResponse(_message.Message):
93
- __slots__ = ("processor_data", "controller_data")
93
+ __slots__ = ("processor_data", "controller_data", "defcals")
94
94
  PROCESSOR_DATA_FIELD_NUMBER: _ClassVar[int]
95
95
  CONTROLLER_DATA_FIELD_NUMBER: _ClassVar[int]
96
+ DEFCALS_FIELD_NUMBER: _ClassVar[int]
96
97
  processor_data: _struct_pb2.Struct
97
98
  controller_data: _struct_pb2.Struct
98
- def __init__(self, processor_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., controller_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ...
99
+ defcals: _containers.RepeatedCompositeFieldContainer[_struct_pb2.Struct]
100
+ def __init__(self, processor_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., controller_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., defcals: _Optional[_Iterable[_Union[_struct_pb2.Struct, _Mapping]]] = ...) -> None: ...
99
101
 
100
102
  class UpdateRequest(_message.Message):
101
103
  __slots__ = ("app_name", "device_name", "processor_data")
@@ -16,7 +16,7 @@ from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
16
16
  from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,boulderopalscaleupsdk/protobuf/v1/task.proto\x12!boulderopalscaleupsdk.protobuf.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x19google/protobuf/any.proto\"\xc7\x01\n\x13StartSessionRequest\x12\x19\n\x08\x61gent_id\x18\x01 \x01(\tR\x07\x61gentId\x12\x19\n\x08\x61pp_name\x18\x02 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x03 \x01(\tR\ndeviceName\x12!\n\x0croutine_name\x18\x04 \x01(\tR\x0broutineName\x12-\n\x04\x64\x61ta\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00R\x04\x64\x61ta\x88\x01\x01\x42\x07\n\x05_data\"\xfc\x01\n\x14UpdateSessionRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId\x12R\n\rcurrent_state\x18\x02 \x01(\x0e\x32-.boulderopalscaleupsdk.protobuf.v1.AgentStateR\x0c\x63urrentState\x12G\n\x07results\x18\x03 \x03(\x0b\x32-.boulderopalscaleupsdk.protobuf.v1.TaskResultR\x07results\x12(\n\x10task_in_progress\x18\x04 \x03(\tR\x0etaskInProgress\"\xac\x03\n\x12\x41gentTasksResponse\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId\x12U\n\x0ctarget_state\x18\x02 \x01(\x0e\x32-.boulderopalscaleupsdk.protobuf.v1.AgentStateH\x00R\x0btargetState\x88\x01\x01\x12=\n\x05tasks\x18\x03 \x03(\x0b\x32\'.boulderopalscaleupsdk.protobuf.v1.TaskR\x05tasks\x12)\n\x10invalidate_tasks\x18\x04 \x03(\tR\x0finvalidateTasks\x12\x66\n\x0bretry_tasks\x18\x05 \x03(\x0b\x32\x45.boulderopalscaleupsdk.protobuf.v1.AgentTasksResponse.RetryTasksEntryR\nretryTasks\x1a=\n\x0fRetryTasksEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0f\n\r_target_state\"\x94\x02\n\x04Task\x12\x17\n\x07task_id\x18\x01 \x01(\tR\x06taskId\x12\x1d\n\nsession_id\x18\x02 \x01(\tR\tsessionId\x12\x1b\n\ttask_type\x18\x03 \x01(\tR\x08taskType\x12(\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyR\x04\x64\x61ta\x12,\n\x0ftimeout_seconds\x18\x05 \x01(\x05H\x00R\x0etimeoutSeconds\x88\x01\x01\x12\x1f\n\x08\x64\x65\x61\x64line\x18\x06 \x01(\x03H\x01R\x08\x64\x65\x61\x64line\x88\x01\x01\x12\x1d\n\ndepends_on\x18\x07 \x03(\tR\tdependsOnB\x12\n\x10_timeout_secondsB\x0b\n\t_deadline\"\xed\x01\n\nTaskResult\x12\x17\n\x07task_id\x18\x01 \x01(\tR\x06taskId\x12\x1d\n\nsession_id\x18\x03 \x01(\tR\tsessionId\x12\x1f\n\x0bresult_type\x18\x04 \x01(\tR\nresultType\x12.\n\x06result\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00R\x06result\x12J\n\x05\x65rror\x18\x06 \x01(\x0b\x32\x32.boulderopalscaleupsdk.protobuf.v1.TaskErrorDetailH\x00R\x05\x65rrorB\n\n\x08response\"{\n\x0fTaskErrorDetail\x12@\n\x04\x63ode\x18\x01 \x01(\x0e\x32,.boulderopalscaleupsdk.protobuf.v1.TaskErrorR\x04\x63ode\x12\x1b\n\x06\x64\x65tail\x18\x02 \x01(\tH\x00R\x06\x64\x65tail\x88\x01\x01\x42\t\n\x07_detail*\xdd\x01\n\nAgentState\x12\x1b\n\x17\x41GENT_STATE_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x41GENT_STATE_ACTIVE_SESSION\x10\x01\x12\x1b\n\x17\x41GENT_STATE_ACTIVE_IDLE\x10\x02\x12)\n%AGENT_STATE_SHUTDOWN_CLIENT_INITIATED\x10\x03\x12*\n&AGENT_STATE_SHUTDOWN_MANAGER_INITIATED\x10\x04\x12\x1e\n\x1a\x41GENT_STATE_SHUTDOWN_FAULT\x10\x05*G\n\tTaskError\x12\x1a\n\x16TASK_ERROR_UNSPECIFIED\x10\x00\x12\x1e\n\x1aTASK_ERROR_NOT_IMPLEMENTED\x10\x01\x32\xe0\x02\n\x13\x41gentManagerService\x12\xa1\x01\n\x0cStartSession\x12\x36.boulderopalscaleupsdk.protobuf.v1.StartSessionRequest\x1a\x35.boulderopalscaleupsdk.protobuf.v1.AgentTasksResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x17/v1/agent/start_session:\x01*\x12\xa4\x01\n\rUpdateSession\x12\x37.boulderopalscaleupsdk.protobuf.v1.UpdateSessionRequest\x1a\x35.boulderopalscaleupsdk.protobuf.v1.AgentTasksResponse\"#\x82\xd3\xe4\x93\x02\x1d\"\x18/v1/agent/update_session:\x01*B\xa8\x02\n%com.boulderopalscaleupsdk.protobuf.v1B\tTaskProtoP\x01ZNgithub.com/qctrl/boulder-opal-scale-up/proto/boulderopalscaleupsdk/protobuf/v1\xa2\x02\x03\x42PX\xaa\x02!Boulderopalscaleupsdk.Protobuf.V1\xca\x02!Boulderopalscaleupsdk\\Protobuf\\V1\xe2\x02-Boulderopalscaleupsdk\\Protobuf\\V1\\GPBMetadata\xea\x02#Boulderopalscaleupsdk::Protobuf::V1b\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,boulderopalscaleupsdk/protobuf/v1/task.proto\x12!boulderopalscaleupsdk.protobuf.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x19google/protobuf/any.proto\"\xc7\x01\n\x13StartSessionRequest\x12\x19\n\x08\x61gent_id\x18\x01 \x01(\tR\x07\x61gentId\x12\x19\n\x08\x61pp_name\x18\x02 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x03 \x01(\tR\ndeviceName\x12!\n\x0croutine_name\x18\x04 \x01(\tR\x0broutineName\x12-\n\x04\x64\x61ta\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00R\x04\x64\x61ta\x88\x01\x01\x42\x07\n\x05_data\"\xfc\x01\n\x14UpdateSessionRequest\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId\x12R\n\rcurrent_state\x18\x02 \x01(\x0e\x32-.boulderopalscaleupsdk.protobuf.v1.AgentStateR\x0c\x63urrentState\x12G\n\x07results\x18\x03 \x03(\x0b\x32-.boulderopalscaleupsdk.protobuf.v1.TaskResultR\x07results\x12(\n\x10task_in_progress\x18\x04 \x03(\tR\x0etaskInProgress\"\xc3\x03\n\x12\x41gentTasksResponse\x12\x1d\n\nsession_id\x18\x01 \x01(\tR\tsessionId\x12U\n\x0ctarget_state\x18\x02 \x01(\x0e\x32-.boulderopalscaleupsdk.protobuf.v1.AgentStateH\x00R\x0btargetState\x88\x01\x01\x12=\n\x05tasks\x18\x03 \x03(\x0b\x32\'.boulderopalscaleupsdk.protobuf.v1.TaskR\x05tasks\x12)\n\x10invalidate_tasks\x18\x04 \x03(\tR\x0finvalidateTasks\x12\x66\n\x0bretry_tasks\x18\x05 \x03(\x0b\x32\x45.boulderopalscaleupsdk.protobuf.v1.AgentTasksResponse.RetryTasksEntryR\nretryTasks\x12\x15\n\x06job_id\x18\x06 \x01(\tR\x05jobId\x1a=\n\x0fRetryTasksEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0f\n\r_target_state\"\x94\x02\n\x04Task\x12\x17\n\x07task_id\x18\x01 \x01(\tR\x06taskId\x12\x1d\n\nsession_id\x18\x02 \x01(\tR\tsessionId\x12\x1b\n\ttask_type\x18\x03 \x01(\tR\x08taskType\x12(\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyR\x04\x64\x61ta\x12,\n\x0ftimeout_seconds\x18\x05 \x01(\x05H\x00R\x0etimeoutSeconds\x88\x01\x01\x12\x1f\n\x08\x64\x65\x61\x64line\x18\x06 \x01(\x03H\x01R\x08\x64\x65\x61\x64line\x88\x01\x01\x12\x1d\n\ndepends_on\x18\x07 \x03(\tR\tdependsOnB\x12\n\x10_timeout_secondsB\x0b\n\t_deadline\"\xed\x01\n\nTaskResult\x12\x17\n\x07task_id\x18\x01 \x01(\tR\x06taskId\x12\x1d\n\nsession_id\x18\x03 \x01(\tR\tsessionId\x12\x1f\n\x0bresult_type\x18\x04 \x01(\tR\nresultType\x12.\n\x06result\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00R\x06result\x12J\n\x05\x65rror\x18\x06 \x01(\x0b\x32\x32.boulderopalscaleupsdk.protobuf.v1.TaskErrorDetailH\x00R\x05\x65rrorB\n\n\x08response\"{\n\x0fTaskErrorDetail\x12@\n\x04\x63ode\x18\x01 \x01(\x0e\x32,.boulderopalscaleupsdk.protobuf.v1.TaskErrorR\x04\x63ode\x12\x1b\n\x06\x64\x65tail\x18\x02 \x01(\tH\x00R\x06\x64\x65tail\x88\x01\x01\x42\t\n\x07_detail*\xdd\x01\n\nAgentState\x12\x1b\n\x17\x41GENT_STATE_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x41GENT_STATE_ACTIVE_SESSION\x10\x01\x12\x1b\n\x17\x41GENT_STATE_ACTIVE_IDLE\x10\x02\x12)\n%AGENT_STATE_SHUTDOWN_CLIENT_INITIATED\x10\x03\x12*\n&AGENT_STATE_SHUTDOWN_MANAGER_INITIATED\x10\x04\x12\x1e\n\x1a\x41GENT_STATE_SHUTDOWN_FAULT\x10\x05*G\n\tTaskError\x12\x1a\n\x16TASK_ERROR_UNSPECIFIED\x10\x00\x12\x1e\n\x1aTASK_ERROR_NOT_IMPLEMENTED\x10\x01\x32\xe0\x02\n\x13\x41gentManagerService\x12\xa1\x01\n\x0cStartSession\x12\x36.boulderopalscaleupsdk.protobuf.v1.StartSessionRequest\x1a\x35.boulderopalscaleupsdk.protobuf.v1.AgentTasksResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x17/v1/agent/start_session:\x01*\x12\xa4\x01\n\rUpdateSession\x12\x37.boulderopalscaleupsdk.protobuf.v1.UpdateSessionRequest\x1a\x35.boulderopalscaleupsdk.protobuf.v1.AgentTasksResponse\"#\x82\xd3\xe4\x93\x02\x1d\"\x18/v1/agent/update_session:\x01*B\xa8\x02\n%com.boulderopalscaleupsdk.protobuf.v1B\tTaskProtoP\x01ZNgithub.com/qctrl/boulder-opal-scale-up/proto/boulderopalscaleupsdk/protobuf/v1\xa2\x02\x03\x42PX\xaa\x02!Boulderopalscaleupsdk.Protobuf.V1\xca\x02!Boulderopalscaleupsdk\\Protobuf\\V1\xe2\x02-Boulderopalscaleupsdk\\Protobuf\\V1\\GPBMetadata\xea\x02#Boulderopalscaleupsdk::Protobuf::V1b\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -30,24 +30,24 @@ if not _descriptor._USE_C_DESCRIPTORS:
30
30
  _globals['_AGENTMANAGERSERVICE'].methods_by_name['StartSession']._serialized_options = b'\202\323\344\223\002\034\"\027/v1/agent/start_session:\001*'
31
31
  _globals['_AGENTMANAGERSERVICE'].methods_by_name['UpdateSession']._loaded_options = None
32
32
  _globals['_AGENTMANAGERSERVICE'].methods_by_name['UpdateSession']._serialized_options = b'\202\323\344\223\002\035\"\030/v1/agent/update_session:\001*'
33
- _globals['_AGENTSTATE']._serialized_start=1673
34
- _globals['_AGENTSTATE']._serialized_end=1894
35
- _globals['_TASKERROR']._serialized_start=1896
36
- _globals['_TASKERROR']._serialized_end=1967
33
+ _globals['_AGENTSTATE']._serialized_start=1696
34
+ _globals['_AGENTSTATE']._serialized_end=1917
35
+ _globals['_TASKERROR']._serialized_start=1919
36
+ _globals['_TASKERROR']._serialized_end=1990
37
37
  _globals['_STARTSESSIONREQUEST']._serialized_start=141
38
38
  _globals['_STARTSESSIONREQUEST']._serialized_end=340
39
39
  _globals['_UPDATESESSIONREQUEST']._serialized_start=343
40
40
  _globals['_UPDATESESSIONREQUEST']._serialized_end=595
41
41
  _globals['_AGENTTASKSRESPONSE']._serialized_start=598
42
- _globals['_AGENTTASKSRESPONSE']._serialized_end=1026
43
- _globals['_AGENTTASKSRESPONSE_RETRYTASKSENTRY']._serialized_start=948
44
- _globals['_AGENTTASKSRESPONSE_RETRYTASKSENTRY']._serialized_end=1009
45
- _globals['_TASK']._serialized_start=1029
46
- _globals['_TASK']._serialized_end=1305
47
- _globals['_TASKRESULT']._serialized_start=1308
48
- _globals['_TASKRESULT']._serialized_end=1545
49
- _globals['_TASKERRORDETAIL']._serialized_start=1547
50
- _globals['_TASKERRORDETAIL']._serialized_end=1670
51
- _globals['_AGENTMANAGERSERVICE']._serialized_start=1970
52
- _globals['_AGENTMANAGERSERVICE']._serialized_end=2322
42
+ _globals['_AGENTTASKSRESPONSE']._serialized_end=1049
43
+ _globals['_AGENTTASKSRESPONSE_RETRYTASKSENTRY']._serialized_start=971
44
+ _globals['_AGENTTASKSRESPONSE_RETRYTASKSENTRY']._serialized_end=1032
45
+ _globals['_TASK']._serialized_start=1052
46
+ _globals['_TASK']._serialized_end=1328
47
+ _globals['_TASKRESULT']._serialized_start=1331
48
+ _globals['_TASKRESULT']._serialized_end=1568
49
+ _globals['_TASKERRORDETAIL']._serialized_start=1570
50
+ _globals['_TASKERRORDETAIL']._serialized_end=1693
51
+ _globals['_AGENTMANAGERSERVICE']._serialized_start=1993
52
+ _globals['_AGENTMANAGERSERVICE']._serialized_end=2345
53
53
  # @@protoc_insertion_point(module_scope)
@@ -57,7 +57,7 @@ class UpdateSessionRequest(_message.Message):
57
57
  def __init__(self, session_id: _Optional[str] = ..., current_state: _Optional[_Union[AgentState, str]] = ..., results: _Optional[_Iterable[_Union[TaskResult, _Mapping]]] = ..., task_in_progress: _Optional[_Iterable[str]] = ...) -> None: ...
58
58
 
59
59
  class AgentTasksResponse(_message.Message):
60
- __slots__ = ("session_id", "target_state", "tasks", "invalidate_tasks", "retry_tasks")
60
+ __slots__ = ("session_id", "target_state", "tasks", "invalidate_tasks", "retry_tasks", "job_id")
61
61
  class RetryTasksEntry(_message.Message):
62
62
  __slots__ = ("key", "value")
63
63
  KEY_FIELD_NUMBER: _ClassVar[int]
@@ -70,12 +70,14 @@ class AgentTasksResponse(_message.Message):
70
70
  TASKS_FIELD_NUMBER: _ClassVar[int]
71
71
  INVALIDATE_TASKS_FIELD_NUMBER: _ClassVar[int]
72
72
  RETRY_TASKS_FIELD_NUMBER: _ClassVar[int]
73
+ JOB_ID_FIELD_NUMBER: _ClassVar[int]
73
74
  session_id: str
74
75
  target_state: AgentState
75
76
  tasks: _containers.RepeatedCompositeFieldContainer[Task]
76
77
  invalidate_tasks: _containers.RepeatedScalarFieldContainer[str]
77
78
  retry_tasks: _containers.ScalarMap[str, str]
78
- def __init__(self, session_id: _Optional[str] = ..., target_state: _Optional[_Union[AgentState, str]] = ..., tasks: _Optional[_Iterable[_Union[Task, _Mapping]]] = ..., invalidate_tasks: _Optional[_Iterable[str]] = ..., retry_tasks: _Optional[_Mapping[str, str]] = ...) -> None: ...
79
+ job_id: str
80
+ def __init__(self, session_id: _Optional[str] = ..., target_state: _Optional[_Union[AgentState, str]] = ..., tasks: _Optional[_Iterable[_Union[Task, _Mapping]]] = ..., invalidate_tasks: _Optional[_Iterable[str]] = ..., retry_tasks: _Optional[_Mapping[str, str]] = ..., job_id: _Optional[str] = ...) -> None: ...
79
81
 
80
82
  class Task(_message.Message):
81
83
  __slots__ = ("task_id", "session_id", "task_type", "data", "timeout_seconds", "deadline", "depends_on")
@@ -1,6 +1,21 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
1
14
  """Routine library."""
2
15
 
3
- __all__ = ["ResonatorMapping", "Routine"]
16
+ __all__ = ["ResonatorMapping", "Routine", "TransmonDiscovery", "TransmonRetuning"]
4
17
 
5
18
  from .common import Routine
6
19
  from .resonator_mapping import ResonatorMapping
20
+ from .transmon_discovery import TransmonDiscovery
21
+ from .transmon_retuning import TransmonRetuning
@@ -1,3 +1,16 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
1
14
  from pydantic import BaseModel, ConfigDict
2
15
 
3
16