openc3 5.18.0 → 5.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -4
  3. data/bin/cstol_converter +14 -14
  4. data/bin/openc3cli +189 -7
  5. data/bin/pipinstall +5 -3
  6. data/data/config/_interfaces.yaml +1 -1
  7. data/data/config/command_modifiers.yaml +59 -0
  8. data/data/config/interface_modifiers.yaml +1 -1
  9. data/data/config/param_item_modifiers.yaml +1 -1
  10. data/data/config/parameter_modifiers.yaml +1 -1
  11. data/data/config/plugins.yaml +6 -2
  12. data/data/config/screen.yaml +2 -2
  13. data/data/config/table_manager.yaml +2 -2
  14. data/data/config/tool.yaml +4 -1
  15. data/data/config/widgets.yaml +31 -3
  16. data/ext/openc3/ext/config_parser/config_parser.c +1 -1
  17. data/ext/openc3/ext/packet/packet.c +4 -1
  18. data/ext/openc3/ext/platform/platform.c +3 -3
  19. data/ext/openc3/ext/structure/structure.c +56 -76
  20. data/lib/openc3/accessors/binary_accessor.rb +4 -4
  21. data/lib/openc3/accessors/form_accessor.rb +2 -2
  22. data/lib/openc3/accessors/http_accessor.rb +1 -1
  23. data/lib/openc3/accessors/json_accessor.rb +6 -4
  24. data/lib/openc3/accessors/template_accessor.rb +6 -9
  25. data/lib/openc3/accessors/xml_accessor.rb +1 -1
  26. data/lib/openc3/api/cmd_api.rb +36 -13
  27. data/lib/openc3/api/limits_api.rb +4 -4
  28. data/lib/openc3/api/tlm_api.rb +2 -1
  29. data/lib/openc3/bridge/bridge_config.rb +1 -2
  30. data/lib/openc3/ccsds/ccsds_parser.rb +12 -8
  31. data/lib/openc3/config/config_parser.rb +5 -1
  32. data/lib/openc3/conversions/bit_reverse_conversion.rb +1 -0
  33. data/lib/openc3/conversions/conversion.rb +5 -1
  34. data/lib/openc3/conversions/generic_conversion.rb +3 -8
  35. data/lib/openc3/conversions/object_read_conversion.rb +1 -8
  36. data/lib/openc3/conversions/polynomial_conversion.rb +3 -8
  37. data/lib/openc3/conversions/processor_conversion.rb +13 -11
  38. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +10 -18
  39. data/lib/openc3/conversions/unix_time_conversion.rb +4 -7
  40. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +4 -3
  41. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +4 -3
  42. data/lib/openc3/core_ext/array.rb +5 -5
  43. data/lib/openc3/core_ext/exception.rb +9 -2
  44. data/lib/openc3/core_ext/string.rb +2 -2
  45. data/lib/openc3/interfaces/http_server_interface.rb +2 -2
  46. data/lib/openc3/interfaces/interface.rb +2 -3
  47. data/lib/openc3/interfaces/linc_interface.rb +3 -3
  48. data/lib/openc3/interfaces/tcpip_server_interface.rb +1 -2
  49. data/lib/openc3/interfaces/udp_interface.rb +5 -3
  50. data/lib/openc3/io/json_api.rb +11 -6
  51. data/lib/openc3/io/json_drb.rb +5 -0
  52. data/lib/openc3/io/json_rpc.rb +11 -10
  53. data/lib/openc3/io/udp_sockets.rb +7 -5
  54. data/lib/openc3/logs/buffered_packet_log_writer.rb +3 -3
  55. data/lib/openc3/logs/log_writer.rb +7 -8
  56. data/lib/openc3/logs/packet_log_writer.rb +7 -7
  57. data/lib/openc3/logs/text_log_writer.rb +4 -4
  58. data/lib/openc3/microservices/critical_cmd_microservice.rb +74 -0
  59. data/lib/openc3/microservices/decom_microservice.rb +43 -11
  60. data/lib/openc3/microservices/interface_microservice.rb +104 -8
  61. data/lib/openc3/microservices/microservice.rb +1 -2
  62. data/lib/openc3/microservices/reaction_microservice.rb +2 -2
  63. data/lib/openc3/microservices/timeline_microservice.rb +14 -16
  64. data/lib/openc3/microservices/trigger_group_microservice.rb +3 -3
  65. data/lib/openc3/migrations/20240915000000_activity_uuid.rb +28 -0
  66. data/lib/openc3/migrations/20241016000000_scope_critical_cmd.rb +24 -0
  67. data/lib/openc3/models/activity_model.rb +116 -83
  68. data/lib/openc3/models/auth_model.rb +31 -2
  69. data/lib/openc3/models/cvt_model.rb +18 -6
  70. data/lib/openc3/models/gem_model.rb +8 -8
  71. data/lib/openc3/models/model.rb +1 -0
  72. data/lib/openc3/models/plugin_model.rb +9 -9
  73. data/lib/openc3/models/python_package_model.rb +5 -3
  74. data/lib/openc3/models/reducer_model.rb +2 -2
  75. data/lib/openc3/models/scope_model.rb +49 -5
  76. data/lib/openc3/models/sorted_model.rb +4 -4
  77. data/lib/openc3/models/target_model.rb +3 -3
  78. data/lib/openc3/models/tool_config_model.rb +1 -1
  79. data/lib/openc3/models/tool_model.rb +4 -4
  80. data/lib/openc3/models/widget_model.rb +11 -5
  81. data/lib/openc3/operators/microservice_operator.rb +2 -3
  82. data/lib/openc3/operators/operator.rb +5 -3
  83. data/lib/openc3/packets/command_validator.rb +48 -0
  84. data/lib/openc3/packets/commands.rb +6 -14
  85. data/lib/openc3/packets/packet.rb +40 -15
  86. data/lib/openc3/packets/packet_config.rb +44 -10
  87. data/lib/openc3/packets/packet_item.rb +5 -1
  88. data/lib/openc3/packets/parsers/packet_parser.rb +3 -3
  89. data/lib/openc3/packets/structure.rb +21 -13
  90. data/lib/openc3/packets/structure_item.rb +33 -47
  91. data/lib/openc3/packets/telemetry.rb +6 -27
  92. data/lib/openc3/script/api_shared.rb +7 -5
  93. data/lib/openc3/script/calendar.rb +3 -8
  94. data/lib/openc3/script/commands.rb +23 -15
  95. data/lib/openc3/script/critical_cmd.rb +91 -0
  96. data/lib/openc3/script/metadata.rb +2 -2
  97. data/lib/openc3/script/screen.rb +2 -2
  98. data/lib/openc3/script/script.rb +17 -0
  99. data/lib/openc3/script/suite.rb +17 -17
  100. data/lib/openc3/script/web_socket_api.rb +3 -3
  101. data/lib/openc3/streams/serial_stream.rb +2 -3
  102. data/lib/openc3/streams/stream.rb +2 -2
  103. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +10 -10
  104. data/lib/openc3/tools/table_manager/table_manager_core.rb +11 -11
  105. data/lib/openc3/tools/table_manager/table_parser.rb +2 -3
  106. data/lib/openc3/top_level.rb +9 -0
  107. data/lib/openc3/topics/command_decom_topic.rb +2 -1
  108. data/lib/openc3/topics/command_topic.rb +19 -3
  109. data/lib/openc3/topics/decom_interface_topic.rb +2 -2
  110. data/lib/openc3/topics/interface_topic.rb +2 -0
  111. data/lib/openc3/topics/telemetry_decom_topic.rb +1 -1
  112. data/lib/openc3/utilities/authentication.rb +7 -3
  113. data/lib/openc3/utilities/authorization.rb +2 -1
  114. data/lib/openc3/utilities/cli_generator.rb +15 -8
  115. data/lib/openc3/utilities/cosmos_rails_formatter.rb +60 -0
  116. data/lib/openc3/utilities/crc.rb +6 -6
  117. data/lib/openc3/utilities/local_mode.rb +2 -1
  118. data/lib/openc3/utilities/logger.rb +45 -34
  119. data/lib/openc3/utilities/metric.rb +1 -2
  120. data/lib/openc3/utilities/quaternion.rb +18 -18
  121. data/lib/openc3/utilities/store_queued.rb +1 -0
  122. data/lib/openc3/utilities/target_file.rb +4 -4
  123. data/lib/openc3/version.rb +5 -5
  124. data/lib/openc3/win32/win32_main.rb +2 -2
  125. data/templates/conversion/conversion.rb +2 -0
  126. data/templates/tool_angular/package.json +22 -22
  127. data/templates/tool_react/package.json +10 -10
  128. data/templates/tool_svelte/build/smui.css +1 -1
  129. data/templates/tool_svelte/package.json +12 -12
  130. data/templates/tool_svelte/src/services/openc3-api.js +17 -17
  131. data/templates/tool_vue/package.json +11 -11
  132. data/templates/widget/package.json +8 -9
  133. metadata +22 -2
@@ -11,37 +11,37 @@
11
11
  "smui-theme": "smui-theme compile build/smui.css -i src/theme"
12
12
  },
13
13
  "dependencies": {
14
- "@astrouxds/astro-web-components": "7.22.1",
15
- "@openc3/tool-common": "5.18.0",
14
+ "@astrouxds/astro-web-components": "7.24.0",
15
+ "@openc3/tool-common": "5.20.0",
16
16
  "@smui/button": "^7.0.0-beta.16",
17
17
  "@smui/card": "^7.0.0-beta.16",
18
18
  "@smui/list": "^7.0.0-beta.16",
19
19
  "@smui/menu": "^7.0.0-beta.16",
20
- "axios": "1.7.4",
20
+ "axios": "1.7.7",
21
21
  "single-spa-svelte": "^2.1.1",
22
22
  "sirv-cli": "^2.0.2",
23
23
  "svelte-portal": "^2.2.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@babel/core": "^7.25.2",
27
- "@babel/preset-env": "^7.25.3",
28
- "@rollup/plugin-commonjs": "^26.0.1",
29
- "@rollup/plugin-node-resolve": "^15.2.3",
30
- "@testing-library/jest-dom": "^6.4.8",
27
+ "@babel/preset-env": "^7.25.4",
28
+ "@rollup/plugin-commonjs": "^28.0.0",
29
+ "@rollup/plugin-node-resolve": "^15.3.0",
30
+ "@testing-library/jest-dom": "^6.5.0",
31
31
  "@testing-library/svelte": "^5.2.1",
32
32
  "babel-jest": "^29.7.0",
33
- "concurrently": "^8.2.2",
33
+ "concurrently": "^9.0.1",
34
34
  "jest": "^29.7.0",
35
- "postcss": "^8.4.41",
35
+ "postcss": "^8.4.47",
36
36
  "prettier": "^3.1.1",
37
- "prettier-plugin-svelte": "^3.1.2",
38
- "rollup": "^4.20.0",
37
+ "prettier-plugin-svelte": "^3.2.7",
38
+ "rollup": "^4.22.4",
39
39
  "rollup-plugin-livereload": "^2.0.5",
40
40
  "rollup-plugin-postcss": "^4.0.2",
41
41
  "rollup-plugin-svelte": "^7.1.6",
42
42
  "rollup-plugin-terser": "^7.0.2",
43
43
  "smui-theme": "^7.0.0-beta.16",
44
- "svelte": "^4.2.8",
44
+ "svelte": "^4.2.19",
45
45
  "svelte-jester": "^5.0.0"
46
46
  }
47
47
  }
@@ -58,9 +58,9 @@ export class OpenC3Api {
58
58
  },
59
59
  },
60
60
  )
61
- // var data = response.data
61
+ // let data = response.data
62
62
  // if (data.error) {
63
- // var err = new Error()
63
+ // let err = new Error()
64
64
  // err.name = data.error.data.class
65
65
  // err.message = data.error.data.message
66
66
  // console.log(data.error.data.backtrace.join('\n'))
@@ -68,7 +68,7 @@ export class OpenC3Api {
68
68
  // }
69
69
  return response.data.result
70
70
  } catch (error) {
71
- var err = new Error()
71
+ let err = new Error()
72
72
  if (error.response) {
73
73
  // The request was made and the server responded with a
74
74
  // status code that falls out of the range of 2xx
@@ -232,8 +232,8 @@ export class OpenC3Api {
232
232
  return this.exec('get_all_tlm', [target_name])
233
233
  }
234
234
 
235
- get_all_tlm_names(target_name) {
236
- return this.exec('get_all_tlm_names', [target_name])
235
+ get_all_tlm_names(target_name, hidden = false) {
236
+ return this.exec('get_all_tlm_names', [target_name], { hidden: hidden })
237
237
  }
238
238
 
239
239
  async get_tlm_packet(target_name, packet_name, value_type, stale_time = 30) {
@@ -243,9 +243,9 @@ export class OpenC3Api {
243
243
  })
244
244
  // Make sure data isn't null or undefined. Note this is the only valid use of == or !=
245
245
  if (data != null) {
246
- var len = data.length
247
- var converted = null
248
- for (var i = 0; i < len; i++) {
246
+ let len = data.length
247
+ let converted = null
248
+ for (let i = 0; i < len; i++) {
249
249
  converted = this.decode_openc3_type(data[i][1])
250
250
  if (converted !== null) {
251
251
  data[i][1] = converted
@@ -267,9 +267,9 @@ export class OpenC3Api {
267
267
  const data = await this.exec('get_tlm_values', [items], {
268
268
  stale_time: stale_time,
269
269
  })
270
- var len = data[0].length
271
- var converted = null
272
- for (var i = 0; i < len; i++) {
270
+ let len = data[0].length
271
+ let converted = null
272
+ for (let i = 0; i < len; i++) {
273
273
  converted = this.decode_openc3_type(data[0][i])
274
274
  if (converted !== null) {
275
275
  data[0][i] = converted
@@ -294,7 +294,7 @@ export class OpenC3Api {
294
294
  ) {
295
295
  data = await this.exec('tlm', [target_name], { type: packet_name })
296
296
  } else {
297
- var err = new Error()
297
+ let err = new Error()
298
298
  err.name = 'TypeError'
299
299
  err.message = `Invalid data type ${packet_name}. Valid options are RAW, CONVERTED, FORMATTED, and WITH_UNITS.`
300
300
  throw err
@@ -304,7 +304,7 @@ export class OpenC3Api {
304
304
  type: value_type,
305
305
  })
306
306
  }
307
- var converted = this.decode_openc3_type(data)
307
+ let converted = this.decode_openc3_type(data)
308
308
  if (converted !== null) {
309
309
  data = converted
310
310
  }
@@ -352,8 +352,8 @@ export class OpenC3Api {
352
352
  return this.exec('get_all_cmds', [target_name])
353
353
  }
354
354
 
355
- get_all_cmd_names(target_name) {
356
- return this.exec('get_all_cmd_names', [target_name])
355
+ get_all_cmd_names(target_name, hidden = false) {
356
+ return this.exec('get_all_cmd_names', [target_name], { hidden: hidden })
357
357
  }
358
358
 
359
359
  get_cmd(target_name, command_name) {
@@ -384,8 +384,8 @@ export class OpenC3Api {
384
384
 
385
385
  // Implementation of functionality shared by cmd methods with param_lists.
386
386
  _cmd(method, target_name, command_name, param_list, headerOptions) {
387
- var converted = null
388
- for (var key in param_list) {
387
+ let converted = null
388
+ for (let key in param_list) {
389
389
  if (Object.prototype.hasOwnProperty.call(param_list, key)) {
390
390
  converted = this.encode_openc3_type(param_list[key])
391
391
  if (converted !== null) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "5.18.0",
3
+ "version": "5.20.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -11,10 +11,10 @@
11
11
  "test:components": "vue-cli-service test:components"
12
12
  },
13
13
  "dependencies": {
14
- "@astrouxds/astro-web-components": "7.22.1",
15
- "@openc3/tool-common": "5.18.0",
16
- "axios": "1.7.4",
17
- "date-fns": "3.6.0",
14
+ "@openc3/tool-common": "5.20.0",
15
+ "@astrouxds/astro-web-components": "7.24.0",
16
+ "axios": "1.7.7",
17
+ "date-fns": "4.1.0",
18
18
  "portal-vue": "2.1.7",
19
19
  "single-spa-vue": "2.5.1",
20
20
  "sprintf-js": "1.1.3",
@@ -25,7 +25,7 @@
25
25
  "vuex": "3.6.2"
26
26
  },
27
27
  "devDependencies": {
28
- "@babel/eslint-parser": "7.25.1",
28
+ "@babel/eslint-parser": "7.25.9",
29
29
  "@vue/babel-preset-app": "5.0.8",
30
30
  "@vue/cli": "5.0.8",
31
31
  "@vue/cli-plugin-babel": "5.0.8",
@@ -35,19 +35,19 @@
35
35
  "@vue/cli-service": "5.0.8",
36
36
  "@vue/eslint-config-prettier": "9.0.0",
37
37
  "@vue/test-utils": "1.3.0",
38
- "babel-loader": "9.1.3",
38
+ "babel-loader": "9.2.1",
39
39
  "babel-plugin-istanbul": "7.0.0",
40
40
  "eslint": "8.56.0",
41
41
  "eslint-config-prettier": "9.1.0",
42
42
  "eslint-plugin-prettier": "5.2.1",
43
- "eslint-plugin-vue": "9.27.0",
43
+ "eslint-plugin-vue": "9.30.0",
44
44
  "html-webpack-plugin": "^5.6.0",
45
45
  "prettier": "3.3.3",
46
- "sass": "1.77.8",
47
- "sass-loader": "14.2.1",
46
+ "sass": "1.80.4",
47
+ "sass-loader": "16.0.2",
48
48
  "vue-cli-plugin-single-spa": "3.3.0",
49
49
  "vue-cli-plugin-vuetify": "2.5.8",
50
50
  "vue-template-compiler": "2.7.16",
51
- "webpack": "5.93.0"
51
+ "webpack": "5.95.0"
52
52
  }
53
53
  }
@@ -1,18 +1,17 @@
1
1
  {
2
2
  "name": "widget",
3
- "version": "5.18.0",
3
+ "version": "5.20.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "build": "vue-cli-service build --target lib --dest tools/widgets/<%= widget_name %> --formats umd-min <%= widget_path %> --name <%= widget_name %>"
7
7
  },
8
8
  "dependencies": {
9
- "@astrouxds/astro-web-components": "7.22.1",
10
- "@openc3/tool-common": "5.18.0",
9
+ "@astrouxds/astro-web-components": "7.24.0",
11
10
  "vue": "2.7.16",
12
11
  "vuetify": "2.7.1"
13
12
  },
14
13
  "devDependencies": {
15
- "@babel/eslint-parser": "7.25.1",
14
+ "@babel/eslint-parser": "7.25.9",
16
15
  "@rushstack/eslint-patch": "1.10.4",
17
16
  "@vue/babel-preset-app": "5.0.8",
18
17
  "@vue/cli": "5.0.8",
@@ -20,17 +19,17 @@
20
19
  "@vue/cli-plugin-eslint": "5.0.8",
21
20
  "@vue/cli-service": "5.0.8",
22
21
  "@vue/eslint-config-prettier": "9.0.0",
23
- "babel-loader": "9.1.3",
22
+ "babel-loader": "9.2.1",
24
23
  "babel-plugin-istanbul": "7.0.0",
25
24
  "eslint": "8.56.0",
26
25
  "eslint-config-prettier": "9.1.0",
27
26
  "eslint-plugin-prettier": "5.2.1",
28
- "eslint-plugin-vue": "9.27.0",
27
+ "eslint-plugin-vue": "9.30.0",
29
28
  "prettier": "3.3.3",
30
- "sass": "1.77.8",
31
- "sass-loader": "14.2.1",
29
+ "sass": "1.80.4",
30
+ "sass-loader": "16.0.2",
32
31
  "vue-cli-plugin-vuetify": "2.5.8",
33
32
  "vue-template-compiler": "2.7.16",
34
- "webpack": "5.93.0"
33
+ "webpack": "5.95.0"
35
34
  }
36
35
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openc3
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.18.0
4
+ version: 5.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Melton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-08-19 00:00:00.000000000 Z
12
+ date: 2024-10-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -697,6 +697,20 @@ dependencies:
697
697
  - - "~>"
698
698
  - !ruby/object:Gem::Version
699
699
  version: '3.10'
700
+ - !ruby/object:Gem::Dependency
701
+ name: rspec-rails
702
+ requirement: !ruby/object:Gem::Requirement
703
+ requirements:
704
+ - - "~>"
705
+ - !ruby/object:Gem::Version
706
+ version: '7.0'
707
+ type: :development
708
+ prerelease: false
709
+ version_requirements: !ruby/object:Gem::Requirement
710
+ requirements:
711
+ - - "~>"
712
+ - !ruby/object:Gem::Version
713
+ version: '7.0'
700
714
  - !ruby/object:Gem::Dependency
701
715
  name: rspec_junit_formatter
702
716
  requirement: !ruby/object:Gem::Requirement
@@ -977,6 +991,7 @@ files:
977
991
  - lib/openc3/logs/stream_log_pair.rb
978
992
  - lib/openc3/logs/text_log_writer.rb
979
993
  - lib/openc3/microservices/cleanup_microservice.rb
994
+ - lib/openc3/microservices/critical_cmd_microservice.rb
980
995
  - lib/openc3/microservices/decom_microservice.rb
981
996
  - lib/openc3/microservices/interface_decom_common.rb
982
997
  - lib/openc3/microservices/interface_microservice.rb
@@ -998,6 +1013,8 @@ files:
998
1013
  - lib/openc3/migrations/20230615000000_autonomic.rb
999
1014
  - lib/openc3/migrations/20230915000002_no_scope_log_messages.rb
1000
1015
  - lib/openc3/migrations/20231022000000_tlm_viewer_config.rb
1016
+ - lib/openc3/migrations/20240915000000_activity_uuid.rb
1017
+ - lib/openc3/migrations/20241016000000_scope_critical_cmd.rb
1001
1018
  - lib/openc3/models/activity_model.rb
1002
1019
  - lib/openc3/models/auth_model.rb
1003
1020
  - lib/openc3/models/cvt_model.rb
@@ -1037,6 +1054,7 @@ files:
1037
1054
  - lib/openc3/operators/microservice_operator.rb
1038
1055
  - lib/openc3/operators/operator.rb
1039
1056
  - lib/openc3/packets/binary_accessor.rb
1057
+ - lib/openc3/packets/command_validator.rb
1040
1058
  - lib/openc3/packets/commands.rb
1041
1059
  - lib/openc3/packets/json_packet.rb
1042
1060
  - lib/openc3/packets/limits.rb
@@ -1065,6 +1083,7 @@ files:
1065
1083
  - lib/openc3/script/api_shared.rb
1066
1084
  - lib/openc3/script/calendar.rb
1067
1085
  - lib/openc3/script/commands.rb
1086
+ - lib/openc3/script/critical_cmd.rb
1068
1087
  - lib/openc3/script/exceptions.rb
1069
1088
  - lib/openc3/script/extract.rb
1070
1089
  - lib/openc3/script/limits.rb
@@ -1124,6 +1143,7 @@ files:
1124
1143
  - lib/openc3/utilities/bucket_require.rb
1125
1144
  - lib/openc3/utilities/bucket_utilities.rb
1126
1145
  - lib/openc3/utilities/cli_generator.rb
1146
+ - lib/openc3/utilities/cosmos_rails_formatter.rb
1127
1147
  - lib/openc3/utilities/crc.rb
1128
1148
  - lib/openc3/utilities/csv.rb
1129
1149
  - lib/openc3/utilities/local_bucket.rb