@opensoha/contracts 0.1.7 → 0.1.8

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 (30) hide show
  1. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  2. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  3. package/fixtures/json-schema/companion-pack/invalid/traversal.json +19 -0
  4. package/fixtures/json-schema/companion-pack/valid/svg.json +47 -0
  5. package/fixtures/json-schema/companion-provenance/invalid/missing-source.json +8 -0
  6. package/fixtures/json-schema/companion-provenance/valid/minimal.json +10 -0
  7. package/fixtures/json-schema/marketplace-catalog/valid/companion-pack.json +39 -0
  8. package/fixtures/json-schema/plugin-manifest/invalid/companion-pack-without-assets.json +17 -0
  9. package/fixtures/json-schema/plugin-manifest/valid/companion-pack.json +28 -0
  10. package/fixtures/openapi/CompanionInteractionReceiptEnvelope/invalid/missing-profile.json +9 -0
  11. package/fixtures/openapi/CompanionInteractionReceiptEnvelope/valid/applied.json +22 -0
  12. package/fixtures/openapi/CompanionInteractionRequest/invalid/client-reward.json +5 -0
  13. package/fixtures/openapi/CompanionInteractionRequest/valid/pet.json +5 -0
  14. package/fixtures/openapi/CompanionPackManifest/invalid/external-entry.json +11 -0
  15. package/fixtures/openapi/CompanionPackManifest/valid/svg.json +20 -0
  16. package/fixtures/openapi/CompanionProfileEnvelope/invalid/level-zero.json +15 -0
  17. package/fixtures/openapi/CompanionProfileEnvelope/valid/default.json +15 -0
  18. package/fixtures/openapi/PluginProvenanceStatement/invalid/algorithm.json +10 -0
  19. package/fixtures/openapi/PluginProvenanceStatement/valid/minimal.json +10 -0
  20. package/gen/go/sohaapi/client.go +1 -1
  21. package/gen/go/sohaapi/types.go +532 -18
  22. package/gen/ts/sohaapi/index.ts +515 -1
  23. package/openapi/soha-api.json +1040 -2
  24. package/openapi/soha-api.yaml +464 -1
  25. package/openapi/spec_generated.go +3 -3
  26. package/package.json +3 -1
  27. package/plugins/companion-pack.schema.json +118 -0
  28. package/plugins/companion-provenance.schema.json +19 -0
  29. package/plugins/marketplace-catalog.schema.json +20 -0
  30. package/plugins/plugin-manifest.schema.json +19 -1
@@ -637,6 +637,18 @@
637
637
  "type": "string"
638
638
  }
639
639
  },
640
+ "PluginAssetPath": {
641
+ "description": "Slash-separated relative path declared by the active companion pack.",
642
+ "in": "path",
643
+ "name": "assetPath",
644
+ "required": true,
645
+ "schema": {
646
+ "maxLength": 512,
647
+ "minLength": 1,
648
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)[A-Za-z0-9._/-]+$",
649
+ "type": "string"
650
+ }
651
+ },
640
652
  "PluginID": {
641
653
  "in": "path",
642
654
  "name": "pluginID",
@@ -6329,6 +6341,481 @@
6329
6341
  ],
6330
6342
  "type": "object"
6331
6343
  },
6344
+ "CompanionActivationRequest": {
6345
+ "additionalProperties": false,
6346
+ "properties": {
6347
+ "version": {
6348
+ "minLength": 1,
6349
+ "type": "string"
6350
+ }
6351
+ },
6352
+ "type": "object"
6353
+ },
6354
+ "CompanionAnimationBindings": {
6355
+ "additionalProperties": false,
6356
+ "properties": {
6357
+ "dragging": {
6358
+ "minLength": 1,
6359
+ "type": "string"
6360
+ },
6361
+ "error": {
6362
+ "minLength": 1,
6363
+ "type": "string"
6364
+ },
6365
+ "hover": {
6366
+ "minLength": 1,
6367
+ "type": "string"
6368
+ },
6369
+ "idle": {
6370
+ "minLength": 1,
6371
+ "type": "string"
6372
+ },
6373
+ "listening": {
6374
+ "minLength": 1,
6375
+ "type": "string"
6376
+ },
6377
+ "speaking": {
6378
+ "minLength": 1,
6379
+ "type": "string"
6380
+ },
6381
+ "tap": {
6382
+ "minLength": 1,
6383
+ "type": "string"
6384
+ },
6385
+ "thinking": {
6386
+ "minLength": 1,
6387
+ "type": "string"
6388
+ }
6389
+ },
6390
+ "type": "object"
6391
+ },
6392
+ "CompanionAsset": {
6393
+ "additionalProperties": false,
6394
+ "properties": {
6395
+ "contentType": {
6396
+ "enum": [
6397
+ "application/json",
6398
+ "application/octet-stream",
6399
+ "image/png",
6400
+ "image/jpeg",
6401
+ "image/webp",
6402
+ "image/svg+xml",
6403
+ "audio/mpeg",
6404
+ "audio/ogg"
6405
+ ],
6406
+ "type": "string"
6407
+ },
6408
+ "kind": {
6409
+ "enum": [
6410
+ "entry",
6411
+ "model",
6412
+ "texture",
6413
+ "motion",
6414
+ "expression",
6415
+ "physics",
6416
+ "pose",
6417
+ "thumbnail",
6418
+ "audio"
6419
+ ],
6420
+ "type": "string"
6421
+ },
6422
+ "path": {
6423
+ "maxLength": 512,
6424
+ "minLength": 1,
6425
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)[A-Za-z0-9._/-]+$",
6426
+ "type": "string"
6427
+ },
6428
+ "sha256": {
6429
+ "pattern": "^sha256:[a-f0-9]{64}$",
6430
+ "type": "string"
6431
+ },
6432
+ "sizeBytes": {
6433
+ "format": "int64",
6434
+ "maximum": 67108864,
6435
+ "minimum": 1,
6436
+ "type": "integer"
6437
+ }
6438
+ },
6439
+ "required": [
6440
+ "path",
6441
+ "kind",
6442
+ "contentType",
6443
+ "sizeBytes",
6444
+ "sha256"
6445
+ ],
6446
+ "type": "object"
6447
+ },
6448
+ "CompanionInteractionDefinition": {
6449
+ "additionalProperties": false,
6450
+ "properties": {
6451
+ "action": {
6452
+ "enum": [
6453
+ "tap",
6454
+ "pet",
6455
+ "feed",
6456
+ "play",
6457
+ "greet"
6458
+ ],
6459
+ "type": "string"
6460
+ },
6461
+ "animation": {
6462
+ "minLength": 1,
6463
+ "type": "string"
6464
+ },
6465
+ "cooldownSeconds": {
6466
+ "maximum": 86400,
6467
+ "minimum": 0,
6468
+ "type": "integer"
6469
+ },
6470
+ "id": {
6471
+ "pattern": "^[a-z][a-z0-9._-]*$",
6472
+ "type": "string"
6473
+ },
6474
+ "label": {
6475
+ "maxLength": 64,
6476
+ "minLength": 1,
6477
+ "type": "string"
6478
+ },
6479
+ "rewardAffinity": {
6480
+ "maximum": 100,
6481
+ "minimum": 0,
6482
+ "type": "integer"
6483
+ },
6484
+ "rewardXp": {
6485
+ "maximum": 1000,
6486
+ "minimum": 0,
6487
+ "type": "integer"
6488
+ }
6489
+ },
6490
+ "required": [
6491
+ "id",
6492
+ "action"
6493
+ ],
6494
+ "type": "object"
6495
+ },
6496
+ "CompanionInteractionReceipt": {
6497
+ "additionalProperties": false,
6498
+ "properties": {
6499
+ "affinityAwarded": {
6500
+ "minimum": 0,
6501
+ "type": "integer"
6502
+ },
6503
+ "applied": {
6504
+ "type": "boolean"
6505
+ },
6506
+ "idempotencyKey": {
6507
+ "type": "string"
6508
+ },
6509
+ "profile": {
6510
+ "$ref": "#/components/schemas/CompanionProfile"
6511
+ },
6512
+ "unlockedIds": {
6513
+ "items": {
6514
+ "type": "string"
6515
+ },
6516
+ "type": "array",
6517
+ "uniqueItems": true
6518
+ },
6519
+ "xpAwarded": {
6520
+ "minimum": 0,
6521
+ "type": "integer"
6522
+ }
6523
+ },
6524
+ "required": [
6525
+ "idempotencyKey",
6526
+ "applied",
6527
+ "xpAwarded",
6528
+ "affinityAwarded",
6529
+ "unlockedIds",
6530
+ "profile"
6531
+ ],
6532
+ "type": "object"
6533
+ },
6534
+ "CompanionInteractionReceiptEnvelope": {
6535
+ "additionalProperties": false,
6536
+ "properties": {
6537
+ "data": {
6538
+ "$ref": "#/components/schemas/CompanionInteractionReceipt"
6539
+ }
6540
+ },
6541
+ "required": [
6542
+ "data"
6543
+ ],
6544
+ "type": "object"
6545
+ },
6546
+ "CompanionInteractionRequest": {
6547
+ "additionalProperties": false,
6548
+ "properties": {
6549
+ "clientRevision": {
6550
+ "format": "int64",
6551
+ "minimum": 1,
6552
+ "type": "integer"
6553
+ },
6554
+ "interactionId": {
6555
+ "pattern": "^[a-z][a-z0-9._-]*$",
6556
+ "type": "string"
6557
+ },
6558
+ "messageId": {
6559
+ "type": "string"
6560
+ },
6561
+ "pluginId": {
6562
+ "type": "string"
6563
+ },
6564
+ "sessionId": {
6565
+ "type": "string"
6566
+ }
6567
+ },
6568
+ "required": [
6569
+ "pluginId",
6570
+ "interactionId"
6571
+ ],
6572
+ "type": "object"
6573
+ },
6574
+ "CompanionPackLicense": {
6575
+ "additionalProperties": false,
6576
+ "properties": {
6577
+ "attribution": {
6578
+ "maxLength": 2048,
6579
+ "type": "string"
6580
+ },
6581
+ "commercialUseAllowed": {
6582
+ "type": "boolean"
6583
+ },
6584
+ "name": {
6585
+ "minLength": 1,
6586
+ "type": "string"
6587
+ },
6588
+ "redistributionAllowed": {
6589
+ "enum": [
6590
+ true
6591
+ ],
6592
+ "type": "boolean"
6593
+ },
6594
+ "sourceUrl": {
6595
+ "format": "uri",
6596
+ "type": "string"
6597
+ },
6598
+ "spdxId": {
6599
+ "minLength": 1,
6600
+ "type": "string"
6601
+ },
6602
+ "url": {
6603
+ "format": "uri",
6604
+ "type": "string"
6605
+ }
6606
+ },
6607
+ "required": [
6608
+ "name",
6609
+ "url",
6610
+ "redistributionAllowed",
6611
+ "commercialUseAllowed"
6612
+ ],
6613
+ "type": "object"
6614
+ },
6615
+ "CompanionPackManifest": {
6616
+ "additionalProperties": false,
6617
+ "properties": {
6618
+ "animations": {
6619
+ "$ref": "#/components/schemas/CompanionAnimationBindings"
6620
+ },
6621
+ "assets": {
6622
+ "items": {
6623
+ "$ref": "#/components/schemas/CompanionAsset"
6624
+ },
6625
+ "maxItems": 512,
6626
+ "minItems": 1,
6627
+ "type": "array"
6628
+ },
6629
+ "entryAsset": {
6630
+ "maxLength": 512,
6631
+ "minLength": 1,
6632
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)[A-Za-z0-9._/-]+$",
6633
+ "type": "string"
6634
+ },
6635
+ "interactions": {
6636
+ "items": {
6637
+ "$ref": "#/components/schemas/CompanionInteractionDefinition"
6638
+ },
6639
+ "maxItems": 64,
6640
+ "type": "array"
6641
+ },
6642
+ "license": {
6643
+ "$ref": "#/components/schemas/CompanionPackLicense"
6644
+ },
6645
+ "modelFormatVersion": {
6646
+ "minLength": 1,
6647
+ "type": "string"
6648
+ },
6649
+ "renderer": {
6650
+ "enum": [
6651
+ "svg",
6652
+ "sprite",
6653
+ "live2d-cubism"
6654
+ ],
6655
+ "type": "string"
6656
+ },
6657
+ "thumbnailAsset": {
6658
+ "maxLength": 512,
6659
+ "minLength": 1,
6660
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)[A-Za-z0-9._/-]+$",
6661
+ "type": "string"
6662
+ },
6663
+ "unlocks": {
6664
+ "items": {
6665
+ "$ref": "#/components/schemas/CompanionUnlockDefinition"
6666
+ },
6667
+ "maxItems": 128,
6668
+ "type": "array"
6669
+ }
6670
+ },
6671
+ "required": [
6672
+ "renderer",
6673
+ "entryAsset",
6674
+ "assets",
6675
+ "license"
6676
+ ],
6677
+ "type": "object"
6678
+ },
6679
+ "CompanionProfile": {
6680
+ "additionalProperties": false,
6681
+ "properties": {
6682
+ "activePluginId": {
6683
+ "type": "string"
6684
+ },
6685
+ "activeVersion": {
6686
+ "type": "string"
6687
+ },
6688
+ "affinity": {
6689
+ "minimum": 0,
6690
+ "type": "integer"
6691
+ },
6692
+ "createdAt": {
6693
+ "format": "date-time",
6694
+ "type": "string"
6695
+ },
6696
+ "id": {
6697
+ "type": "string"
6698
+ },
6699
+ "lastInteractionAt": {
6700
+ "format": "date-time",
6701
+ "type": "string"
6702
+ },
6703
+ "level": {
6704
+ "maximum": 100,
6705
+ "minimum": 1,
6706
+ "type": "integer"
6707
+ },
6708
+ "ownerId": {
6709
+ "type": "string"
6710
+ },
6711
+ "revision": {
6712
+ "format": "int64",
6713
+ "minimum": 1,
6714
+ "type": "integer"
6715
+ },
6716
+ "unlockedIds": {
6717
+ "items": {
6718
+ "type": "string"
6719
+ },
6720
+ "type": "array",
6721
+ "uniqueItems": true
6722
+ },
6723
+ "updatedAt": {
6724
+ "format": "date-time",
6725
+ "type": "string"
6726
+ },
6727
+ "xp": {
6728
+ "minimum": 0,
6729
+ "type": "integer"
6730
+ }
6731
+ },
6732
+ "required": [
6733
+ "id",
6734
+ "ownerId",
6735
+ "activePluginId",
6736
+ "activeVersion",
6737
+ "level",
6738
+ "xp",
6739
+ "affinity",
6740
+ "unlockedIds",
6741
+ "revision",
6742
+ "createdAt",
6743
+ "updatedAt"
6744
+ ],
6745
+ "type": "object"
6746
+ },
6747
+ "CompanionProfileEnvelope": {
6748
+ "additionalProperties": false,
6749
+ "properties": {
6750
+ "data": {
6751
+ "$ref": "#/components/schemas/CompanionProfile"
6752
+ }
6753
+ },
6754
+ "required": [
6755
+ "data"
6756
+ ],
6757
+ "type": "object"
6758
+ },
6759
+ "CompanionProfileResetRequest": {
6760
+ "additionalProperties": false,
6761
+ "properties": {
6762
+ "pluginId": {
6763
+ "type": "string"
6764
+ }
6765
+ },
6766
+ "type": "object"
6767
+ },
6768
+ "CompanionRollbackRequest": {
6769
+ "additionalProperties": false,
6770
+ "properties": {
6771
+ "reason": {
6772
+ "maxLength": 512,
6773
+ "type": "string"
6774
+ },
6775
+ "version": {
6776
+ "minLength": 1,
6777
+ "type": "string"
6778
+ }
6779
+ },
6780
+ "required": [
6781
+ "version"
6782
+ ],
6783
+ "type": "object"
6784
+ },
6785
+ "CompanionUnlockDefinition": {
6786
+ "additionalProperties": false,
6787
+ "properties": {
6788
+ "id": {
6789
+ "pattern": "^[a-z][a-z0-9._-]*$",
6790
+ "type": "string"
6791
+ },
6792
+ "kind": {
6793
+ "enum": [
6794
+ "interaction",
6795
+ "animation",
6796
+ "expression",
6797
+ "asset"
6798
+ ],
6799
+ "type": "string"
6800
+ },
6801
+ "level": {
6802
+ "maximum": 100,
6803
+ "minimum": 1,
6804
+ "type": "integer"
6805
+ },
6806
+ "ref": {
6807
+ "minLength": 1,
6808
+ "type": "string"
6809
+ }
6810
+ },
6811
+ "required": [
6812
+ "id",
6813
+ "kind",
6814
+ "level",
6815
+ "ref"
6816
+ ],
6817
+ "type": "object"
6818
+ },
6332
6819
  "ComputeAccessMode": {
6333
6820
  "enum": [
6334
6821
  "direct",
@@ -12803,6 +13290,15 @@
12803
13290
  "InstalledPlugin": {
12804
13291
  "additionalProperties": false,
12805
13292
  "properties": {
13293
+ "activeVersion": {
13294
+ "type": "string"
13295
+ },
13296
+ "artifacts": {
13297
+ "items": {
13298
+ "$ref": "#/components/schemas/PluginArtifactRecord"
13299
+ },
13300
+ "type": "array"
13301
+ },
12806
13302
  "checksumStatus": {
12807
13303
  "type": "string"
12808
13304
  },
@@ -19627,6 +20123,9 @@
19627
20123
  "minSohaVersion": {
19628
20124
  "type": "string"
19629
20125
  },
20126
+ "package": {
20127
+ "$ref": "#/components/schemas/PluginPackageDescriptor"
20128
+ },
19630
20129
  "packageUrl": {
19631
20130
  "type": "string"
19632
20131
  },
@@ -22581,6 +23080,64 @@
22581
23080
  },
22582
23081
  "type": "object"
22583
23082
  },
23083
+ "PluginArtifactRecord": {
23084
+ "additionalProperties": false,
23085
+ "properties": {
23086
+ "active": {
23087
+ "type": "boolean"
23088
+ },
23089
+ "checksumStatus": {
23090
+ "enum": [
23091
+ "verified",
23092
+ "mismatch"
23093
+ ],
23094
+ "type": "string"
23095
+ },
23096
+ "installedAt": {
23097
+ "format": "date-time",
23098
+ "type": "string"
23099
+ },
23100
+ "provenanceStatus": {
23101
+ "enum": [
23102
+ "verified",
23103
+ "not_provided",
23104
+ "invalid"
23105
+ ],
23106
+ "type": "string"
23107
+ },
23108
+ "sha256": {
23109
+ "pattern": "^sha256:[a-f0-9]{64}$",
23110
+ "type": "string"
23111
+ },
23112
+ "signatureStatus": {
23113
+ "enum": [
23114
+ "verified",
23115
+ "not_provided",
23116
+ "untrusted",
23117
+ "invalid"
23118
+ ],
23119
+ "type": "string"
23120
+ },
23121
+ "sizeBytes": {
23122
+ "format": "int64",
23123
+ "minimum": 1,
23124
+ "type": "integer"
23125
+ },
23126
+ "version": {
23127
+ "type": "string"
23128
+ }
23129
+ },
23130
+ "required": [
23131
+ "version",
23132
+ "sha256",
23133
+ "sizeBytes",
23134
+ "checksumStatus",
23135
+ "signatureStatus",
23136
+ "provenanceStatus",
23137
+ "active"
23138
+ ],
23139
+ "type": "object"
23140
+ },
22584
23141
  "PluginAssetSnapshot": {
22585
23142
  "additionalProperties": false,
22586
23143
  "properties": {
@@ -23048,6 +23605,9 @@
23048
23605
  "marketplaceUrl": {
23049
23606
  "type": "string"
23050
23607
  },
23608
+ "package": {
23609
+ "$ref": "#/components/schemas/PluginPackageDescriptor"
23610
+ },
23051
23611
  "pluginId": {
23052
23612
  "type": "string"
23053
23613
  },
@@ -23090,6 +23650,9 @@
23090
23650
  "capabilities": {
23091
23651
  "$ref": "#/components/schemas/PluginCapabilityRequest"
23092
23652
  },
23653
+ "companionPack": {
23654
+ "$ref": "#/components/schemas/CompanionPackManifest"
23655
+ },
23093
23656
  "compatibility": {
23094
23657
  "$ref": "#/components/schemas/PluginCompatibility"
23095
23658
  },
@@ -23154,7 +23717,8 @@
23154
23717
  "metric-extension",
23155
23718
  "notification-channel",
23156
23719
  "identity-template",
23157
- "ui-extension"
23720
+ "ui-extension",
23721
+ "companion-pack"
23158
23722
  ],
23159
23723
  "type": "string"
23160
23724
  },
@@ -23288,6 +23852,62 @@
23288
23852
  ],
23289
23853
  "type": "object"
23290
23854
  },
23855
+ "PluginPackageDescriptor": {
23856
+ "additionalProperties": false,
23857
+ "properties": {
23858
+ "contentType": {
23859
+ "enum": [
23860
+ "application/zip",
23861
+ "application/gzip",
23862
+ "application/x-tar"
23863
+ ],
23864
+ "type": "string"
23865
+ },
23866
+ "provenanceUrl": {
23867
+ "format": "uri",
23868
+ "type": "string"
23869
+ },
23870
+ "sbomUrl": {
23871
+ "format": "uri",
23872
+ "type": "string"
23873
+ },
23874
+ "sha256": {
23875
+ "pattern": "^sha256:[a-f0-9]{64}$",
23876
+ "type": "string"
23877
+ },
23878
+ "signature": {
23879
+ "minLength": 1,
23880
+ "type": "string"
23881
+ },
23882
+ "signatureAlgorithm": {
23883
+ "enum": [
23884
+ "ed25519"
23885
+ ],
23886
+ "type": "string"
23887
+ },
23888
+ "signingKeyId": {
23889
+ "pattern": "^[a-z][a-z0-9._-]*$",
23890
+ "type": "string"
23891
+ },
23892
+ "sizeBytes": {
23893
+ "format": "int64",
23894
+ "maximum": 268435456,
23895
+ "minimum": 1,
23896
+ "type": "integer"
23897
+ },
23898
+ "url": {
23899
+ "format": "uri",
23900
+ "type": "string"
23901
+ }
23902
+ },
23903
+ "required": [
23904
+ "url",
23905
+ "contentType",
23906
+ "sizeBytes",
23907
+ "sha256"
23908
+ ],
23909
+ "type": "object"
23910
+ },
23291
23911
  "PluginPermissionRequest": {
23292
23912
  "additionalProperties": false,
23293
23913
  "properties": {
@@ -23306,6 +23926,58 @@
23306
23926
  },
23307
23927
  "type": "object"
23308
23928
  },
23929
+ "PluginProvenanceStatement": {
23930
+ "additionalProperties": false,
23931
+ "description": "The Ed25519 signature covers UTF-8 lines subjectSha256, builderId, sourceUri, sourceCommit, and builtAt in that order, joined with LF and without a trailing LF.",
23932
+ "properties": {
23933
+ "builderId": {
23934
+ "maxLength": 512,
23935
+ "minLength": 1,
23936
+ "type": "string"
23937
+ },
23938
+ "builtAt": {
23939
+ "format": "date-time",
23940
+ "type": "string"
23941
+ },
23942
+ "signature": {
23943
+ "minLength": 1,
23944
+ "type": "string"
23945
+ },
23946
+ "signatureAlgorithm": {
23947
+ "enum": [
23948
+ "ed25519"
23949
+ ],
23950
+ "type": "string"
23951
+ },
23952
+ "signingKeyId": {
23953
+ "pattern": "^[a-z][a-z0-9._-]*$",
23954
+ "type": "string"
23955
+ },
23956
+ "sourceCommit": {
23957
+ "pattern": "^[A-Fa-f0-9]{7,64}$",
23958
+ "type": "string"
23959
+ },
23960
+ "sourceUri": {
23961
+ "format": "uri",
23962
+ "type": "string"
23963
+ },
23964
+ "subjectSha256": {
23965
+ "pattern": "^sha256:[a-f0-9]{64}$",
23966
+ "type": "string"
23967
+ }
23968
+ },
23969
+ "required": [
23970
+ "subjectSha256",
23971
+ "builderId",
23972
+ "sourceUri",
23973
+ "sourceCommit",
23974
+ "builtAt",
23975
+ "signingKeyId",
23976
+ "signatureAlgorithm",
23977
+ "signature"
23978
+ ],
23979
+ "type": "object"
23980
+ },
23309
23981
  "PluginResourceExtensions": {
23310
23982
  "additionalProperties": false,
23311
23983
  "properties": {
@@ -28920,7 +29592,7 @@
28920
29592
  "info": {
28921
29593
  "description": "Public OpenSoha core API contract. This first contract focuses on stable cross-repository boundaries: auth, health, runner-facing control-plane callbacks, AI Gateway, and MCP capability discovery.\n",
28922
29594
  "title": "Soha API",
28923
- "version": "0.1.7"
29595
+ "version": "0.1.8"
28924
29596
  },
28925
29597
  "openapi": "3.1.0",
28926
29598
  "paths": {
@@ -37409,6 +38081,151 @@
37409
38081
  ]
37410
38082
  }
37411
38083
  },
38084
+ "/companion/interactions": {
38085
+ "post": {
38086
+ "operationId": "recordCompanionInteraction",
38087
+ "parameters": [
38088
+ {
38089
+ "$ref": "#/components/parameters/IdempotencyKey"
38090
+ }
38091
+ ],
38092
+ "requestBody": {
38093
+ "content": {
38094
+ "application/json": {
38095
+ "schema": {
38096
+ "$ref": "#/components/schemas/CompanionInteractionRequest"
38097
+ }
38098
+ }
38099
+ },
38100
+ "required": true
38101
+ },
38102
+ "responses": {
38103
+ "200": {
38104
+ "content": {
38105
+ "application/json": {
38106
+ "schema": {
38107
+ "$ref": "#/components/schemas/CompanionInteractionReceiptEnvelope"
38108
+ }
38109
+ }
38110
+ },
38111
+ "description": "Existing idempotent interaction result."
38112
+ },
38113
+ "201": {
38114
+ "content": {
38115
+ "application/json": {
38116
+ "schema": {
38117
+ "$ref": "#/components/schemas/CompanionInteractionReceiptEnvelope"
38118
+ }
38119
+ }
38120
+ },
38121
+ "description": "Interaction applied to the companion profile."
38122
+ },
38123
+ "400": {
38124
+ "$ref": "#/components/responses/Error"
38125
+ },
38126
+ "401": {
38127
+ "$ref": "#/components/responses/Error"
38128
+ },
38129
+ "403": {
38130
+ "$ref": "#/components/responses/Error"
38131
+ },
38132
+ "404": {
38133
+ "$ref": "#/components/responses/Error"
38134
+ },
38135
+ "409": {
38136
+ "$ref": "#/components/responses/Error"
38137
+ },
38138
+ "422": {
38139
+ "$ref": "#/components/responses/Error"
38140
+ },
38141
+ "503": {
38142
+ "$ref": "#/components/responses/Error"
38143
+ }
38144
+ },
38145
+ "tags": [
38146
+ "Companion"
38147
+ ]
38148
+ }
38149
+ },
38150
+ "/companion/profile": {
38151
+ "get": {
38152
+ "operationId": "getCompanionProfile",
38153
+ "responses": {
38154
+ "200": {
38155
+ "content": {
38156
+ "application/json": {
38157
+ "schema": {
38158
+ "$ref": "#/components/schemas/CompanionProfileEnvelope"
38159
+ }
38160
+ }
38161
+ },
38162
+ "description": "Current principal's companion profile."
38163
+ },
38164
+ "401": {
38165
+ "$ref": "#/components/responses/Error"
38166
+ },
38167
+ "403": {
38168
+ "$ref": "#/components/responses/Error"
38169
+ },
38170
+ "503": {
38171
+ "$ref": "#/components/responses/Error"
38172
+ }
38173
+ },
38174
+ "tags": [
38175
+ "Companion"
38176
+ ]
38177
+ }
38178
+ },
38179
+ "/companion/profile/reset": {
38180
+ "post": {
38181
+ "operationId": "resetCompanionProfile",
38182
+ "parameters": [
38183
+ {
38184
+ "$ref": "#/components/parameters/IdempotencyKey"
38185
+ }
38186
+ ],
38187
+ "requestBody": {
38188
+ "content": {
38189
+ "application/json": {
38190
+ "schema": {
38191
+ "$ref": "#/components/schemas/CompanionProfileResetRequest"
38192
+ }
38193
+ }
38194
+ },
38195
+ "required": false
38196
+ },
38197
+ "responses": {
38198
+ "200": {
38199
+ "content": {
38200
+ "application/json": {
38201
+ "schema": {
38202
+ "$ref": "#/components/schemas/CompanionProfileEnvelope"
38203
+ }
38204
+ }
38205
+ },
38206
+ "description": "Companion progression reset for the selected pack."
38207
+ },
38208
+ "401": {
38209
+ "$ref": "#/components/responses/Error"
38210
+ },
38211
+ "403": {
38212
+ "$ref": "#/components/responses/Error"
38213
+ },
38214
+ "404": {
38215
+ "$ref": "#/components/responses/Error"
38216
+ },
38217
+ "409": {
38218
+ "$ref": "#/components/responses/Error"
38219
+ },
38220
+ "503": {
38221
+ "$ref": "#/components/responses/Error"
38222
+ }
38223
+ },
38224
+ "tags": [
38225
+ "Companion"
38226
+ ]
38227
+ }
38228
+ },
37412
38229
  "/compute/access-sources": {
37413
38230
  "get": {
37414
38231
  "operationId": "listComputeAccessSources",
@@ -42155,6 +42972,40 @@
42155
42972
  ]
42156
42973
  }
42157
42974
  },
42975
+ "/marketplace/plugins/{pluginID}/{version}/provenance.json": {
42976
+ "get": {
42977
+ "operationId": "getPublicMarketplacePluginProvenance",
42978
+ "parameters": [
42979
+ {
42980
+ "$ref": "#/components/parameters/PluginID"
42981
+ },
42982
+ {
42983
+ "in": "path",
42984
+ "name": "version",
42985
+ "required": true,
42986
+ "schema": {
42987
+ "type": "string"
42988
+ }
42989
+ }
42990
+ ],
42991
+ "responses": {
42992
+ "200": {
42993
+ "content": {
42994
+ "application/json": {
42995
+ "schema": {
42996
+ "$ref": "#/components/schemas/PluginProvenanceStatement"
42997
+ }
42998
+ }
42999
+ },
43000
+ "description": "Immutable signed provenance statement for a plugin package."
43001
+ }
43002
+ },
43003
+ "security": [],
43004
+ "tags": [
43005
+ "Marketplace"
43006
+ ]
43007
+ }
43008
+ },
42158
43009
  "/mcp/capabilities": {
42159
43010
  "get": {
42160
43011
  "operationId": "listMCPCapabilities",
@@ -42660,6 +43511,137 @@
42660
43511
  ]
42661
43512
  }
42662
43513
  },
43514
+ "/plugins/{pluginID}/activate": {
43515
+ "post": {
43516
+ "operationId": "activateInstalledPlugin",
43517
+ "parameters": [
43518
+ {
43519
+ "$ref": "#/components/parameters/PluginID"
43520
+ },
43521
+ {
43522
+ "$ref": "#/components/parameters/IdempotencyKey"
43523
+ }
43524
+ ],
43525
+ "requestBody": {
43526
+ "content": {
43527
+ "application/json": {
43528
+ "schema": {
43529
+ "$ref": "#/components/schemas/CompanionActivationRequest"
43530
+ }
43531
+ }
43532
+ },
43533
+ "required": false
43534
+ },
43535
+ "responses": {
43536
+ "200": {
43537
+ "content": {
43538
+ "application/json": {
43539
+ "schema": {
43540
+ "$ref": "#/components/schemas/InstalledPluginEnvelope"
43541
+ }
43542
+ }
43543
+ },
43544
+ "description": "Companion pack version activated."
43545
+ },
43546
+ "401": {
43547
+ "$ref": "#/components/responses/Error"
43548
+ },
43549
+ "403": {
43550
+ "$ref": "#/components/responses/Error"
43551
+ },
43552
+ "404": {
43553
+ "$ref": "#/components/responses/Error"
43554
+ },
43555
+ "409": {
43556
+ "$ref": "#/components/responses/Error"
43557
+ },
43558
+ "422": {
43559
+ "$ref": "#/components/responses/Error"
43560
+ },
43561
+ "503": {
43562
+ "$ref": "#/components/responses/Error"
43563
+ }
43564
+ },
43565
+ "tags": [
43566
+ "Plugins"
43567
+ ]
43568
+ }
43569
+ },
43570
+ "/plugins/{pluginID}/assets/{assetPath}": {
43571
+ "get": {
43572
+ "operationId": "getInstalledPluginAsset",
43573
+ "parameters": [
43574
+ {
43575
+ "$ref": "#/components/parameters/PluginID"
43576
+ },
43577
+ {
43578
+ "$ref": "#/components/parameters/PluginAssetPath"
43579
+ }
43580
+ ],
43581
+ "responses": {
43582
+ "200": {
43583
+ "content": {
43584
+ "application/json": {
43585
+ "schema": {
43586
+ "format": "binary",
43587
+ "type": "string"
43588
+ }
43589
+ },
43590
+ "application/octet-stream": {
43591
+ "schema": {
43592
+ "format": "binary",
43593
+ "type": "string"
43594
+ }
43595
+ },
43596
+ "image/jpeg": {
43597
+ "schema": {
43598
+ "format": "binary",
43599
+ "type": "string"
43600
+ }
43601
+ },
43602
+ "image/png": {
43603
+ "schema": {
43604
+ "format": "binary",
43605
+ "type": "string"
43606
+ }
43607
+ },
43608
+ "image/svg+xml": {
43609
+ "schema": {
43610
+ "format": "binary",
43611
+ "type": "string"
43612
+ }
43613
+ },
43614
+ "image/webp": {
43615
+ "schema": {
43616
+ "format": "binary",
43617
+ "type": "string"
43618
+ }
43619
+ }
43620
+ },
43621
+ "description": "Immutable verified asset from the active companion pack.",
43622
+ "headers": {
43623
+ "Cache-Control": {
43624
+ "schema": {
43625
+ "type": "string"
43626
+ }
43627
+ }
43628
+ }
43629
+ },
43630
+ "401": {
43631
+ "$ref": "#/components/responses/Error"
43632
+ },
43633
+ "403": {
43634
+ "$ref": "#/components/responses/Error"
43635
+ },
43636
+ "404": {
43637
+ "$ref": "#/components/responses/Error"
43638
+ }
43639
+ },
43640
+ "tags": [
43641
+ "Plugins"
43642
+ ]
43643
+ }
43644
+ },
42663
43645
  "/plugins/{pluginID}/config": {
42664
43646
  "put": {
42665
43647
  "operationId": "configureInstalledPlugin",
@@ -42770,6 +43752,62 @@
42770
43752
  ]
42771
43753
  }
42772
43754
  },
43755
+ "/plugins/{pluginID}/rollback": {
43756
+ "post": {
43757
+ "operationId": "rollbackInstalledPlugin",
43758
+ "parameters": [
43759
+ {
43760
+ "$ref": "#/components/parameters/PluginID"
43761
+ },
43762
+ {
43763
+ "$ref": "#/components/parameters/IdempotencyKey"
43764
+ }
43765
+ ],
43766
+ "requestBody": {
43767
+ "content": {
43768
+ "application/json": {
43769
+ "schema": {
43770
+ "$ref": "#/components/schemas/CompanionRollbackRequest"
43771
+ }
43772
+ }
43773
+ },
43774
+ "required": false
43775
+ },
43776
+ "responses": {
43777
+ "200": {
43778
+ "content": {
43779
+ "application/json": {
43780
+ "schema": {
43781
+ "$ref": "#/components/schemas/InstalledPluginEnvelope"
43782
+ }
43783
+ }
43784
+ },
43785
+ "description": "Companion pack rolled back to a retained verified version."
43786
+ },
43787
+ "401": {
43788
+ "$ref": "#/components/responses/Error"
43789
+ },
43790
+ "403": {
43791
+ "$ref": "#/components/responses/Error"
43792
+ },
43793
+ "404": {
43794
+ "$ref": "#/components/responses/Error"
43795
+ },
43796
+ "409": {
43797
+ "$ref": "#/components/responses/Error"
43798
+ },
43799
+ "422": {
43800
+ "$ref": "#/components/responses/Error"
43801
+ },
43802
+ "503": {
43803
+ "$ref": "#/components/responses/Error"
43804
+ }
43805
+ },
43806
+ "tags": [
43807
+ "Plugins"
43808
+ ]
43809
+ }
43810
+ },
42773
43811
  "/plugins/{pluginID}/upgrade": {
42774
43812
  "post": {
42775
43813
  "operationId": "upgradeInstalledPlugin",